回答

收藏

SQL:多个具有不同条件的计数句

技术问答 技术问答 401 人阅读 | 0 人回复 | 2023-09-11

我只想知道是否有任何方法可以使用查询从一个表中获得两个单独的计数总数?换句话说,使用类似于下表的表,我想检索每个代码(不同)并显示状态总数不等于X或D然后增加一列显示状态总数等于X或D,并且取消日期大于给定日期(如最近14天)。
& i+ X$ E+ O7 F8 `/ q8 j( U4 ?桌子:# y  K- p+ u7 u" c* v% M4 w
Code:  Status  Cancel_Date-----------------------------------AAA    X        2012年 -02-01AAABBB    X        2012年 -02-01AAA    D        2012年 -01-01AAABBB    BBB    D        2012年 -02-01BBB    X        2012年 -01-01结果示例(基于以上数据):
- {" E* y  x5 H3 L3 T8 KCode:  TotalNotXorD     TotalXorD------------------------------------AAA     2                                                                                                                                                                                                                            BBB                                                                                                                                              TotalNotXorD:例如
1 Z& {3 Q5 z( e6 ~- cselect code,count(*) from table where status not in('X','D') group by codeTotalXorD:例如0 p9 z7 m8 Z. q# ?! I+ c
select code,count(*) from table where status in('X','D')   and cancel_date >= '2012-02-01' group by code我看过做子查询,但似乎得不到所需的结果。# I0 H  ^" T; U$ T' j
有什么想法吗?
+ J. ?! ^1 \$ [/ {谢谢。- A+ s/ J  r& n" H
                                                               
8 m! F% e/ l3 Y    解决方案:                                                               
: J- V. {- ]# `( G5 N( r& M8 y                                                                ~~~~
+ c3 V( C( s' c% JSELECT  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或干脆做 CASE9 [  a' u" D  b- `: }
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    tableNameGROUP   BY Code
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则