2011-02-23 60 views
5

我有兩個查詢,我只需要計算總記錄數,但查詢中唯一的區別是一個字段值。將兩個SELECT查詢合併爲一個

示例;

SELECT COUNT(*) AS group_a 
FROM tbl 
WHERE category = 'value_a' 

SELECT COUNT(*) AS group_b 
FROM tbl 
WHERE category = 'value_b' 

我怎樣才能得到這樣的:(僞)

SELECT COUNT(*) AS group_a, COUNT(*) AS group_b 
FROM tbl 
WHERE category IN ('value_a', 'value_b') 

但結果都是這樣

group_a , group_b 
56, 101 

我在查詢思維CASE語句來過濾兩個,但我如何實現它?或者,還有更好的方法?

我做了UNION,但現在想知道如果我能有兩個結果

回答

6
select sum(case when category = 'value_a' then 1 else 0 end) as group_a, 
     sum(case when category = 'value_b' then 1 else 0 end) as group_b 
    from tbl 
    where category in ('value_a', 'value_b') 
+3

請注意,where子句只會幫助索引列「category」 – 2011-02-23 14:32:27

+0

@Phillip:您當然是正確的。 – 2011-02-23 14:50:53

+0

downvoter會照顧解釋他們的反對嗎? – 2011-02-23 14:51:15

2
select sum(case when category = 'value_a' then 1 else 0 end) group_a, 
     sum(case when category = 'value_b' then 1 else 0 end) group_b 
from tbl 
2
SELECT category,COUNT(*) FROM tbl 
GROUP BY category; 

一個可擴展到多個類別返回一條記錄。如果你想只是這些類別

SELECT category,COUNT(*) FROM tbl 
WHERE category IN ('value_a', 'value_b') 
GROUP BY category; 
+1

您應該爲它添加一個WHERE類別IN('value_a','value_b')。 – 2011-02-23 14:32:45

+0

該死的你互聯網,你很快。 – corrodedmonkee 2011-02-23 14:36:05

+0

這個答案不正確。任務是將這些組合成一行。 – TToni 2011-02-23 14:36:30

1

只是爲了好玩:

SELECT * 
FROM 
(
    SELECT category 
    FROM tbl 
) subquery 
PIVOT 
(
    COUNT(category) 
    FOR category IN ([value_a],[value_b]) 
) AS piv 
+0

對不起,我沒有注意到PostgreSQL。但是如果你使用的是MS SQL 2005+,那麼這個數據透視是一個很酷的功能。 – SQLMason 2011-02-23 15:26:54

+0

PostgreSQL也有支點,它是一個contrib模塊:http://www.postgresql.org/docs/current/interactive/tablefunc.html – 2011-02-23 15:29:49

2

計數什麼奇怪的答案。這裏有一個簡單的計數:

SELECT COUNT(category = 'value_a' OR NULL) AS group_a, COUNT(category = 'value_b' OR NULL) AS group_b FROM tbl; 

在PostgreSQL的count集合允許複雜的語法像我展示。請注意0​​是非常重要的,因爲COUNT只計算條件爲category = '...' OR NULL給出非空答案的那些行。

+0

+1,用於怪異的PostgreSQL-only語法:) – rsenna 2011-02-23 15:58:03