|
我只想知道是否有任何方法可以使用查询从一个表中获得两个单独的计数总数?换句话说,使用类似于下表的表,我想检索每个代码(不同)并显示状态总数不等于X或D然后增加一列显示状态总数等于X或D,并且取消日期大于给定日期(如最近14天)。
" ~9 M' O2 s4 ?桌子:
& S/ s( O' K1 z; [- XCode: 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结果示例(基于以上数据):
/ M. z6 o6 k- J* x1 C# M, pCode: TotalNotXorD TotalXorD------------------------------------AAA 2 BBB TotalNotXorD:例如' M3 }' e( b K: p! h9 |5 W
select code,count(*) from table where status not in('X','D') group by codeTotalXorD:例如0 o5 m p6 e/ }9 e3 g$ o7 I4 [
select code,count(*) from table where status in('X','D') and cancel_date >= '2012-02-01' group by code我看过做子查询,但似乎得不到所需的结果。( V) D* e. n: c; C/ E; P! T5 H! x
有什么想法吗?
0 w3 e( }2 V8 @6 o谢谢。3 f) `1 C3 T& H2 n+ {
" M! s7 \$ a, A4 H! I e) ?
解决方案:
# g6 D3 s) F* r" }1 D: z7 _! `' ?1 E ~~~~
; z! w7 |4 k2 H# c H, }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或干脆做 CASE8 B1 B! I, _- K8 K
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 |
|