2011-09-27 147 views
1

需要雙組我有一個查詢這樣的事情,通過價值

SELECT SOME_ID, COUNT(ANOTHER_ID) AS WITHOUT_FILTER 
from SOME_TABLE GROUP BY SOME_ID 

這將返回我

+------------+------------------+ 
| SOME_ID | WITHOUT_FILTER | 
+------------+------------------+ 
| 1   | 40    | 
| 2   | 30    | 
+------------+------------------+ 

我有這給了我過濾值的條件相同的查詢。

SELECT SOME_ID, COUNT(ANOTHER_ID) AS WITH_FILTER 
from SOME_TABLE WHERE SOME_COL > 10 GROUP BY SOME_ID 

這在grouped_by部分

+------------+----------------+ 
| SOME_ID | WITH_FILTER | 
+------------+----------------+ 
| 1   | 20    | 
| 2   | 15    | 
+------------+----------------+ 

返回顯然更小的值現在,我需要一個查詢給我兩個計數值,即與條件,沒有一個單一的查詢條件。結果應該是這樣的

+----------+----------------+---------------+ 
| SOME_ID | WITHOUT_FILTER | WITH_FILTER | 
+----------+----------------+---------------+ 
| 1  | 40    | 20   | 
| 2  | 30    | 15   | 
+------------+--------------+---------------+ 

請幫幫我。

回答

4

你可以這樣做:

SELECT 
    SOME_ID, 
    COUNT(ANOTHER_ID) AS WITHOUT_FILTER 
    SUM(case when SOME_CONDITION then 1 else 0 end) AS WITH_FILTER 

from SOME_TABLE GROUP BY SOME_ID 
+0

+1。打敗我吧。 –

+0

+1我被擊敗了兩次:由答案和@JoeStefanelli在「擊敗我」評論 –

+0

我寫了一個補充答案,探討了這個問題。 –

0

嘗試CASE和SUM組合:

SELECT SOME_ID, COUNT(ANOTHER_ID) as WITHOUT_FILTER, 
SUM(CASE WHEN SOME_COL > 10 THEN 1 else 0 END) as WITH_FILTER 
from SOME_TABLE GROUP BY SOME_ID; 
1

你可以得到一個 「COUNT,但只適用於行符合條件的」 使用IF效應( )和SUM。

SELECT SOME_ID, 
     COUNT(ANOTHER_ID) AS WITHOUT_FILTER, 
     SUM(IF(SOME_COL > 10, 1, 0)) AS WITH_FILTER 
FROM SOME_TABLE GROUP BY SOME_ID 

(注:該解決方案,除阿德里安的所有其他人,有一個微妙的問題,如果ANOTHER_ID是有史以來NULL如果是這樣的話,那麼阿德里安的是隻有一個是真正正確的。)。

1

爲了學習的目的,這裏是我的2美分。您可以在這兩個領域使用COUNT

SELECT SOME_ID, 
     COUNT(ANOTHER_ID) AS WITHOUT_FILTER 
     COUNT(case 
       when WHEN SOME_COL > 10 then ANOTHER_ID 
       else NULL 
      end) AS WITH_FILTER 
from SOME_TABLE GROUP BY SOME_ID 

訣竅是,COUNT計數非空值。這個特性是ANSI SQL支持的,BTW。

+0

我在想,使用這種技術在兩個COUNT列之間要完全一致,您可能希望使用'then ANOTHER_ID'作爲計數值。否則,你會計算ANOTHER_ID爲NULL的情況,但只在第二列中,可以想象,WITH_FILTER會比WITHOUT_FILTER計數更高。 (所有其他解決方案,包括我的,都有同樣的問題)。 –

+1

考慮到這一點,隨着這一改變,這實際上是唯一真正正確的答案。 –

+0

你是對的。只是改變了我的答案。 –

0
SELECT T1.SOME_ID, 
     COUNT(T1.ANOTHER_ID) AS WITH_FILTER, 
     COUNT(T2.ANOTHER_ID) AS WITHOUT_FILTER 
FROM SOME_TABLE as T1, 
     SOME_TABLE as T2 
WHERE 
     T1.SOME_ID=T2.SOME_ID 
    AND T2.SOME_COL > 10 
GROUP BY T1.SOME_ID, T2.SOME_ID 

或者你可以用2次合併做,如果你的條件變得過於敏感