SQL Server如何按日期统计不同type_id值对应的行数
固定type_id取值的条件聚合写法(推荐,性能最优、逻辑易懂)
你不需要使用子查询,直接在现有分组查询的基础上使用条件聚合即可实现需求,代码如下:
SELECT report_date AS [date], SUM(CASE WHEN type_id = 1 THEN 1 ELSE 0 END) AS count_1, SUM(CASE WHEN type_id = 2 THEN 1 ELSE 0 END) AS count_2, SUM(CASE WHEN type_id = 3 THEN 1 ELSE 0 END) AS count_3 FROM MY_TABLE GROUP BY report_date ORDER BY report_date
实现逻辑:按report_date分组后,对每个type_id匹配的行计数1、不匹配的计数0,求和后就是对应type的当日行数,无匹配值时会返回0,完全符合你给出的预期输出。
type_id取值不固定的动态PIVOT写法
如果后续会新增type_id取值、不想每次手动修改查询语句,可以用动态SQL自动生成所有统计列:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) -- 自动识别所有type_id、生成对应的统计列名 SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME('count_' + CAST(type_id AS VARCHAR(10))) FROM MY_TABLE FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') -- 拼接PIVOT查询语句 SET @query = 'SELECT report_date AS [date], ' + @cols + ' FROM ( SELECT report_date, ''count_'' + CAST(type_id AS VARCHAR(10)) AS type_col, 1 AS cnt FROM MY_TABLE ) x PIVOT ( COUNT(cnt) FOR type_col IN (' + @cols + ') ) p ORDER BY report_date' -- 执行动态查询 EXEC sp_executesql @query
该写法会自动匹配表中所有存在的type_id值生成统计列,不需要手动调整代码。
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

