SQL:使用不同条件的多个计数语句

49
我想知道是否有一种方法可以使用一个查询从表中获取两个单独的“计数”总数?也就是说,使用类似于以下表格的表格,我想检索每个代码(不同)并显示不等于X或D的状态的总数,并且有一个额外的列,显示状态等于X或D且取消日期大于给定日期(比如最近14天)的总数。
表格:
Code:  Status  Cancel_Date
-----------------------------------
AAA    X       2012-02-01
AAA
BBB    X       2012-02-01
AAA    D       2012-01-01
AAA
BBB    
BBB    D       2012-02-01
BBB    X       2012-01-01

根据上述数据,示例结果如下:

Code:  TotalNotXorD     TotalXorD
------------------------------------
AAA    2                1
BBB    1                2

TotalNotXorD: 例如

select code, count(*) 
from table 
where status not in('X','D') 
group by code

TotalXorD: 例如

select code, count(*) 
from table 
where status in('X','D') 
  and cancel_date >= '2012-02-01' 
group by code

我尝试过使用子查询等方法,但似乎无法得到所需的结果。

有什么想法吗?

谢谢。


你使用的是哪个数据库? - Michas
1
可能是如何使用一个SQL查询获取多个计数?的重复问题。 - Tab Alleman
1个回答

122

SELECT  a.code,
        COALESCE(b.totalNotXorD, 0 ) totalNotXorD,
        COALESCE(c.totalXorD, 0 ) totalXorD,
FROM    (SELECT DISTINCT Code FROM tableName) a
        LEFT JOIN
        (
            select code, count(*) totalNotXorD
            from table 
            where status not in('X','D') 
            group by code
        ) b ON a.code = b.code
        LEFT JOIN
        (
            select code, count(*) totalXorD
            from table 
            where status in('X','D') 
              and cancel_date >= '2012-02-01' 
            group by code
        ) c ON a.code = c.code

或者只是使用 CASE
SELECT  Code,
        SUM(CASE WHEN status NOT IN ('X','D') OR status IS NULL THEN 1 ELSE 0 END) TotalNotXorD,
        SUM(CASE WHEN status IN ('X','D') AND cancel_date >= '2012-02-01' THEN 1 ELSE 0 END) TotalXorD  
FROM    tableName
GROUP   BY Code

1
感谢您的回复JW。我已经尝试了一下,但是我遇到了以下错误,这与我自己遇到的问题类似:错误:列“status”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。(状态:37000,本机代码:1FB8)错误:列“status”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。(状态:37000,本机代码:1FB8) - jj2
我认为 ELSE 0 是多余的,因为否则它将是 NULL,至少在 psql 中是这样。 - CervEd
@CervEd 没错(至少在 PostgreSQL 中是这样):THEN 1 END 可以正常工作。 - Nate Barbettini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接