如何使SUM子句针对指定ID统计总数?SQL查询问题求助
问题:按ID统计'Good'状态数与对应ID总记录数的比率
我想要获取指定ID对应的'Good'状态记录数与该ID总记录数的比率。当前使用的SQL查询在IN子句仅包含单个ID时可正常运行,但添加多个ID后,Total字段会统计所有ID的总记录数,而非单个ID的总数。需说明的是,ID并非主键,存在重复情况,统计的均为记录数量(整数)。
现有查询语句:
SELECT ID, COUNT ( CASE WHEN [Status] = 'Good' THEN 1 END ) Good, SUM(COUNT(*))over() as Total FROM TABLE WHERE ID IN ('ID1','ID2') GROUP BY ID
例如,ID1共有45条记录,其中10条状态为'Good',我希望返回10和45这两个数值,请问如何修改SUM子句使其针对单个ID统计总数?
解决方案
你不需要用窗口函数的SUM(COUNT(*))over(),因为已经按ID分组了,直接用COUNT(*)就能得到每个ID的总记录数。
修改后的SQL:
SELECT ID, COUNT(CASE WHEN [Status] = 'Good' THEN 1 END) AS Good, COUNT(*) AS Total, -- 可选:直接计算比率,转换为FLOAT避免整数除法 CAST(COUNT(CASE WHEN [Status] = 'Good' THEN 1 END) AS FLOAT) / COUNT(*) AS GoodRatio FROM TABLE WHERE ID IN ('ID1','ID2') GROUP BY ID
说明:
COUNT(CASE WHEN [Status] = 'Good' THEN 1 END):仅统计当前ID下状态为'Good'的记录,不满足条件的行返回NULL,COUNT会忽略NULL值。COUNT(*):分组后统计的是当前ID对应的所有记录数,正好是你需要的单个ID总数。- 如果你需要直接得到比率,把
Good的统计值转成FLOAT(或对应数据库的浮点类型),避免整数除法导致结果被截断为0。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

