如何通过SQL按月份统计Type为Yes的行占比?
解决按月份统计Type="Yes"占比的SQL问题
原SQL的核心问题是直接把字符串类型的Type转成INT会报错,因为"Yes"/"No"无法直接转换。只需要修改求和的部分,把字符串判断后转成数值即可,以下是修正后的代码:
SELECT CONCAT(DATEPART(MONTH, Date), '/', DATEPART(YEAR, Date)) AS Month, CAST(1.0 * SUM(CASE WHEN Type = 'Yes' THEN 1 ELSE 0 END) / COUNT(*) AS DECIMAL(5,2)) AS Percentage FROM [table] -- 注意table是SQL关键字,建议用方括号包裹或更换表名 GROUP BY DATEPART(YEAR, Date), DATEPART(MONTH, Date) ORDER BY DATEPART(YEAR, Date), DATEPART(MONTH, Date)
修改说明:
- 替换了原代码中
SUM(CAST(Type AS INT))为SUM(CASE WHEN Type = 'Yes' THEN 1 ELSE 0 END):通过CASE表达式将"Yes"映射为1,"No"映射为0,这样就能正常求和统计符合条件的行数。 - 调整了日期格式:用
CONCAT拼接月份和年份,得到你需要的1/2013这种格式(如果需要两位月份比如01/2013,可以用RIGHT('0' + CAST(DATEPART(MONTH, Date) AS VARCHAR), 2)代替DATEPART(MONTH, Date))。 - 修正了原SQL的语法错误:原代码中
CAST(1.00*SUM(...) / COUNT(*) AS DECIMAL(5,2)缺少闭合括号,同时移除了不需要的Year、Month、Passes、Total列(如果需要保留可以加回去)。 - 给表名
table加了方括号:因为table是SQL保留关键字,直接使用会报错。
测试结果:
用你提供的示例数据运行,会返回:
| Month | Percentage |
|---|---|
| 1/2013 | 0.50 |
| 2/2013 | 1.00 |
如果需要百分比不带小数末尾的0,可以把DECIMAL(5,2)改成FLOAT或者调整精度。
内容的提问来源于stack exchange,提问作者ChazC
相关产品推荐
相关产品推荐

