【问题标题】:count * twice with the same column under different conditionscount * 在不同条件下同一列两次
【发布时间】:2016-10-21 01:22:31
【问题描述】:

我试图在同一列的不同 where 条件下对同一列计数(*)两次

这就是我所拥有的;我尝试了很多东西,但无法让它发挥作用。我不想写两个不同的查询。

SELECT somedate as date, 
count(*) as goodone, 
sum(money) as goodcost 
FROM goods 
where goodstatus=2 group by date;

当 goodstatus = 1 时,那是 badone,所以我也想包含它,而不是为它编写单独的查询。

最后,我想要的是

somedate | goodone | badones| goodcost

如果我尝试执行一个子查询,则会返回多行错误

(SELECT count(*) FROM goods where goodstatus=1) as badones 

在上面的查询中。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    根据条件计算记录,而不是添加新查询

    试试这个方法

    SELECT somedate            AS date,
           Sum(goodstatus = 2) AS goodone,
           Sum(goodstatus = 1) AS badones,
           Sum(money)          AS goodcost
    FROM   goods
    WHERE  goodstatus IN ( 1, 2 )
    GROUP  BY date; 
    

    使用CASE语句的另一种方式

    count(case when goodstatus = 2 then 1 end) AS goodone,
    count(case when goodstatus = 1 then 1 end) AS badones,
    

    在上面的CASE语句中,当条件满足时会产生1,否则会产生NULL。 Count聚合不会计算NULL的值通过这个我们可以找到goodstatus = 2或goodstatus = 1的出现次数

    【讨论】:

    • goodstatus=2 不会是布尔值,并且 sum 采用 int64 或 unsigned int 吗?
    • Jep - 这就是它起作用的原因;) - 小组的诀窍......提示:也许你必须在没有时间部分的情况下按日期分组 - 不知道你的数据......
    • 布尔类型MySQL表示为INT,当条件满足时返回1否则0
    • 不太适合我,日期只是类似于 2016-10-20
    • 问题是 goodstatus = 2 返回一个布尔值,它不是 mySQL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2019-08-08
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多