SQL技术求助:能否在同一行设置两个统计值并计算占比?
解决方案:同一行展示双统计值并计算占比
嘿,我来帮你搞定这个问题!你想要在同一行展示缺陷数(Defect_Count)和总数(Total_Count),还要计算两者的占比,之前的CASE语句没达到预期效果,核心原因是没有配合聚合函数和分组操作,咱们一步步来修正:
问题分析
你之前的查询只是逐行对description进行判断赋值,但没有把同一Date和Shift下的记录聚合起来,所以会返回多行零散的0或者count值,没法得到一行的汇总结果。
修正后的SQL代码
SELECT Date, Shift, -- 聚合同一班次日期下的缺陷数 SUM(CASE WHEN description = 'Defects' THEN count ELSE 0 END) AS Defect_Count, -- 聚合同一班次日期下的总数 SUM(CASE WHEN description = 'Total' THEN count ELSE 0 END) AS Total_Count, -- 计算缺陷占比,处理总数为0的异常情况 CASE WHEN SUM(CASE WHEN description = 'Total' THEN count ELSE 0 END) = 0 THEN 0 ELSE ROUND( SUM(CASE WHEN description = 'Defects' THEN count ELSE 0 END) * 1.0 / SUM(CASE WHEN description = 'Total' THEN count ELSE 0 END), 2 ) END AS Defect_Ratio FROM ("Queries union") AS combined_data -- 按日期和班次分组,确保同一组的统计值合并到一行 GROUP BY Date, Shift ORDER BY Date, Shift;
关键细节说明
- 聚合函数
SUM():用它包裹CASE语句,能把同一Date+Shift分组下的所有匹配记录的count累加起来,最终得到一行的汇总值。 - 占比计算的细节:
- 乘
1.0是为了将整数除法转换为浮点除法,避免出现3/5=0这种整数截断的问题; ROUND(..., 2)用来保留两位小数,你可以根据需求调整保留位数;- 增加了总数为0的判断,防止出现除以零的报错。
- 乘
- 别名
combined_data:给你的联合查询结果起一个别名,这是SQL语法要求,避免语法错误。
如果你的内层"Queries union"已经是按Date+Shift+description分组后的汇总结果,那么用MAX()替换SUM()也能得到正确结果,但SUM()的兼容性更强,不管内层是否提前汇总都能正常工作。
内容的提问来源于stack exchange,提问作者Qsec
相关产品推荐
相关产品推荐

