SQL Server分类数据表转换:按Status和Verified_Status唯一值统计计数
实现方案
需求本质是双分类字段的行转列按年聚合统计,SQL Server中可以通过以下两种方案实现:
方案1:已知枚举值的静态写法(性能最优,适配你的样例场景)
直接用条件聚合实现,逻辑清晰易维护:
SELECT Year, SUM(CASE WHEN Status = 'Accepted' THEN 1 ELSE 0 END) AS Accepted, SUM(CASE WHEN Status = 'Rejected' THEN 1 ELSE 0 END) AS Rejected, SUM(CASE WHEN Verified_Status = 'Verified' THEN 1 ELSE 0 END) AS Verified, SUM(CASE WHEN Verified_Status = 'Unverified' THEN 1 ELSE 0 END) AS Unverified FROM 你的实际表名 GROUP BY Year ORDER BY Year DESC
把代码中的你的实际表名替换为真实表名,执行结果和你给出的期望输出完全一致。
方案2:未知枚举值的动态写法
如果两个字段的枚举值会动态新增,不想每次手动修改代码,可以用动态SQL自动拼接所有唯一值生成查询语句:
DECLARE @sql NVARCHAR(MAX) = N'SELECT Year ' -- 拼接Status字段的所有唯一值统计列 SELECT @sql += N', SUM(CASE WHEN Status = ''' + [Value] + ''' THEN 1 ELSE 0 END) AS ' + QUOTENAME([Value]) FROM (SELECT DISTINCT Status AS [Value] FROM 你的实际表名) t -- 拼接Verified_Status字段的所有唯一值统计列 SELECT @sql += N', SUM(CASE WHEN Verified_Status = ''' + [Value] + ''' THEN 1 ELSE 0 END) AS ' + QUOTENAME([Value]) FROM (SELECT DISTINCT Verified_Status AS [Value] FROM 你的实际表名) t SET @sql += N' FROM 你的实际表名 GROUP BY Year ORDER BY Year DESC' EXEC sp_executesql @sql
注意:如果枚举值里存在特殊字符或空格,动态写法中的
QUOTENAME会自动处理转义,避免语法报错。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

