2010-05-16 255 views
5

任何人都可以幫助我使用Apache Derby SQL中的SQL查詢來獲取「簡單」計數。SQL聚合查詢問題

給定一個表ABC看起來像這樣...

  
    id a b c 
    1 1 1 1 
    2 1 1 2 
    3 2 1 3 
    4 2 1 1 
** 5 2 1 2 ** 
** 6 2 2 1 ** 
    7 3 1 2 
    8 3 1 3 
    9 3 1 1 

我如何編寫一個查詢得到的計數怎麼可能的不同值「A」兼得(B = 1和c = 2)AND(b = 2和c = 1)得到正確的結果1.(兩行標記符合條件並且都具有a = 2的值,在該表中只有1個不同的值匹配標準)

棘手的是,(b=1 and c=2) AND (b=2 and c=1)顯然是相互排斥,當應用到單個行。 ..所以如何將該表達式應用於多行不同值的行?

這些查詢都是錯誤的,而是爲了說明什麼,我試圖做...
SELECT DISTINCT COUNT(a) WHERE b=1 AND c=2 AND b=2 AND c=1 ...
。(0)沒有去,因爲相互排斥
SELECT DISTINCT COUNT(a) WHERE b=1 AND c=2 OR b=2 AND c=1 ...
。(3)讓我錯了結果。
SELECT COUNT(a) (CASE WHEN b=1 AND c=10 THEN 1 END) FROM ABC WHERE b=2 AND c=1
。(0)沒有去,因爲相互排斥

乾杯, 菲爾。

+0

(a,b,c)是否是唯一的?換句話說,是否可以有兩行具有不同的ID,但a,b和c的值相同? – 2010-05-16 22:16:59

回答

7

我假設(a,b,c)是唯一的。要做到這一點的方法之一是使用自聯接:

SELECT COUNT(*) 
FROM ABC T1 
JOIN ABC T2 
ON  T1.a = T2.a 
WHERE T1.b = 1 AND T1.c = 2 
AND T2.b = 2 AND T2.c = 1 

這個工程概念如下:

  • 查找所有滿足(b,c) = (1,2)
  • 查找所有滿足(b,c) = (2,1)
  • 行的行
  • 當a相同時加入上述兩組。
  • 計算連接結果中的行數。

的另一種方式,這可能是更容易理解是使用子查詢:

SELECT COUNT(*) 
FROM ABC 
WHERE a IN (SELECT a FROM ABC 
      WHERE b = 2 
      AND c = 1) 
AND b = 1 
AND c = 2 

注:如果有可複製的(A,B,C),然後代替SELECT COUNT(*)使用SELECT COUNT(DISTINCT T1.a)值在第一個查詢中,並在第二個SELECT COUNT(DISTINCT a)

這些查詢在MySQL中測試,而不是Apache Derby,但我希望它們也能在那裏工作。

+0

感謝大家的答案,特別是給你標記以及迅速準確的答案。我嘗試了你的第二個建議,它完美地工作。 現在,因爲我實際上正在嘗試編寫交叉表報表,所以我想知道是否必須爲b和c值的每個組合都有一個查詢,或者我是否可以以某種方式在一個查詢中完成所有操作。 乾杯,菲爾。 – Phil 2010-05-17 10:19:49

0

棘手的一點是,當施加到單個行

正是這樣(B = 1和c = 2)和(b = 2和c = 1)是明顯相互排斥的。在考慮記錄的集合時,需要行的不同「a」值的數量,其中 OR(b = 2 and c = 1)。試試這個:

SELECT COUNT(DISTINCT a) FROM "abc" WHERE (b=1 OR c=2) OR (b=2 OR c=1) 
+0

應該在括號內的最後一個查詢中是「AND」。 – 2010-05-17 01:10:54

1

根據Apache Derby's SQL support page,Mark的第二個查詢確實應該被Apache Derby支持。

SELECT COUNT(DISTINCT a) FROM ABC 
WHERE b = 1 AND c = 2 
    AND a IN (SELECT a FROM ABC WHERE b = 2 AND c = 1); 

除了比自聯接版本更易於閱讀,它還應該更快,因爲您可以避免必須執行JOIN的開銷。