You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:12:00