Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
166 views
in Technique[技术] by (71.8m points)

sql - Best way to get a count of each category type

I have a query below which returns the product_id, product_name and category_name from two different tables.

SELECT p.product_id, 
       p.product_name, 
       c.category_name 
FROM   [BikeStore].[production].[products] p 
       JOIN [BikeStore].[production].[categories] c 
         ON p.category_id = c.category_id 
ORDER  BY c.category_name 

enter image description here

I want to add a fourth column next to each row showing how many of each categories are there.

I wrote the query for this like this below:

  SELECT p.product_id, 
       p.product_name, 
       c.category_name, 
       (SELECT Count(*) 
        FROM   [BikeStore].[production].[products] p1 
               JOIN [BikeStore].[production].[categories] c1 
                 ON p1.category_id = c1.category_id 
        WHERE  c1.category_id = c.category_id) AS totals 
FROM   [BikeStore].[production].[products] p 
       JOIN [BikeStore].[production].[categories] c 
         ON p.category_id = c.category_id 
ORDER  BY c.category_name 

enter image description here

I am not sure if this is the right approach. Could you please let me know if there is a better way to do this.

question from:https://stackoverflow.com/questions/65601636/best-way-to-get-a-count-of-each-category-type

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can use a window function:

SELECT p.product_id, 
       p.product_name, 
       c.category_name,
       COUNT(*) OVER (PARTITION BY c.category_name)
FROM [BikeStore].[production].[products] p JOIN
     [BikeStore].[production].[categories] c 
     ON p.category_id = c.category_id 
ORDER  BY c.category_name 

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...