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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:36:41