首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL在count和group by中使用CASE

问SQL在count和group by中使用CASE
EN

Stack Overflow用户
提问于 2014-07-08 23:55:47
回答 3查看 41.1K关注 0票数 9

我使用CASE对表中的数据进行分类和计数,但结果并不准确

实时演示[here]

代码语言:javascript
复制
select DATE(date) as day, count(*),
count(distinct case when name = 'fruit' then 1 else 0 end) as fruits,
count(distinct case when name = 'vege' then 1 else 0 end) as vege,
count(distinct case when name = 'sweets' then 1 else 0 end) as sweets
from food
group by day
with rollup

我不确定问题出在CASE还是字符串匹配上,因为没有‘=’,它还是算作1?有什么建议我会很感激的

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-09 00:01:01

您的问题是,COUNT会计算每个非NULL的结果。在您的示例中,您使用的是:

代码语言:javascript
复制
COUNT(distinct case when name = 'sweets' then 1 else 0 end)

因此,当名称不是sweets时,它会计算0。此外,由于您使用的是DISTINCT,因此它只计算一个或两个值。您应该使用SUM或删除DISTINCT和ELSE 0

代码语言:javascript
复制
SELECT  DATE(date) as day, 
        COUNT(*),
        SUM(CASE WHEN name = 'fruit' THEN 1 ELSE 0 END) as fruits,
        SUM(CASE WHEN name = 'vege' THEN 1 ELSE 0 END) as vege,
        SUM(CASE WHEN name = 'sweets' THEN 1 ELSE 0 END) as sweets
FROM food
GROUP BY DAY
WITH ROLLUP

或者:

代码语言:javascript
复制
SELECT  DATE(date) as day, 
        COUNT(*),
        COUNT(CASE WHEN name = 'fruit' THEN 1 ELSE NULL END) as fruits,
        COUNT(CASE WHEN name = 'vege' THEN 1 ELSE NULL END) as vege,
        COUNT(CASE WHEN name = 'sweets' THEN 1 ELSE NULL END) as sweets
FROM food
GROUP BY DAY
WITH ROLLUP

修改后的sqlfiddle。

票数 18
EN

Stack Overflow用户

发布于 2014-07-08 23:58:49

不能按别名分组。您必须按表达式进行分组。

代码语言:javascript
复制
group by date(date)
票数 2
EN

Stack Overflow用户

发布于 2017-07-18 22:36:42

您可以对别名进行分组:

代码语言:javascript
复制
SELECT 
     FROM_UNIXTIME(UnixTimeField, '%Y') AS 'Year'
     ,FROM_UNIXTIME(UnixTimeField, '%m') AS 'Month'

FROM table p

GROUP BY  Year, Month
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24636412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档