如何在SQL中统计单行内相同值的条目数?
解决SQL单行多列相同值统计问题
你之前的SQL仅针对Day1单一列统计,未覆盖Day2和Day3,因此无法得到单行内三个列中'D'的总数。要实现需求,需将三个列的判断结果累加,具体方法如下:
方法1:SUM+CASE逐列判断累加
把每个列中等于'D'的情况转为1,否则为0,再将三个列的结果相加,最终得到每个Name对应的'D'总数:
SELECT Name, SUM( CASE WHEN Day1 = 'D' THEN 1 ELSE 0 END + CASE WHEN Day2 = 'D' THEN 1 ELSE 0 END + CASE WHEN Day3 = 'D' THEN 1 ELSE 0 END ) AS D_Count FROM MyTable WHERE Name = 'Name1' -- 仅统计Name1可保留此条件,统计所有Name则删除 GROUP BY Name;
方法2:COUNT+CASE逐列统计后相加
利用COUNT忽略NULL的特性,每个列符合条件时返回1(非空值),否则返回NULL,再将三个列的统计结果相加:
SELECT Name, COUNT(CASE WHEN Day1 = 'D' THEN 1 END) + COUNT(CASE WHEN Day2 = 'D' THEN 1 END) + COUNT(CASE WHEN Day3 = 'D' THEN 1 END) AS D_Count FROM MyTable WHERE Name = 'Name1' GROUP BY Name;
原SQL问题说明
- 示例SQL1:仅统计
Day1列等于'D'的行数,而非单行内多列的'D'数量,结果是所有行中Day1为'D'的总数,不是单个Name的多列总和。 - 示例SQL2:同样只针对
Day1列统计,未涉及Day2和Day3,自然无法得到正确的单行多列统计结果。
内容的提问来源于stack exchange,提问作者Melger
相关产品推荐
相关产品推荐

