2015-02-17 118 views
1

我正在使用Java和SQL,並且我正在計算寵物動物園中的所有山羊。我知道我可以使用以下查詢:你可以在一個SQL語句中返回多個COUNT嗎?

SELECT COUNT(1) FROM PettingZoo pz WHERE pz.animalType = 'GOAT' 

夠簡單。現在,讓我們說山羊有三種顏色之一:棕色,黑色或灰色。如果要計算每種顏色的數量,我可以執行以下查詢:

SELECT COUNT(1) FROM PettingZoo pz WHERE pz.animalType = 'GOAT' AND 
     pz.animalType.color = 'BROWN' 

    SELECT COUNT(1) FROM PettingZoo pz WHERE pz.animalType = 'GOAT' AND 
     pz.animalType.color = 'BLACK' 

    SELECT COUNT(1) FROM PettingZoo pz WHERE pz.animalType = 'GOAT' AND 
     pz.animalType.color = 'GREY' 

此方法有效,但速度很慢。這樣做可以四次打開表格:一次獲得總計數,另外3次用於各種顏色。 有沒有什麼辦法可以返回中的所有四種顏色一個查詢?

編輯:爲了清楚起見,假設有15只山羊。九個是棕色的,0個是黑色的,另外六個是灰色的。第一個查詢返回15.第二個返回9.第三個和最後一個查詢分別返回0和6。我正在尋找一次返回所有四個值(所以我不會在四次不同的時間讀同一個表)。可能是一個數組? {15,9,0,6}

+0

你的意思是像'山羊'和顏色('布朗','黑','灰色')? – kosa 2015-02-17 22:41:07

+0

是否需要不同的值,如 - 棕色值,黑色值和灰色值? – Makoto 2015-02-17 22:43:10

回答

3
SELECT SUM(case when pz.animalType.color = 'BROWN' then 1 else 0 end) as browns, 
     SUM(case when pz.animalType.color = 'BLACK' then 1 else 0 end) as blacks, 
     SUM(case when pz.animalType.color = 'GREY' then 1 else 0 end) as greys , 
     COUNT(1) as total 
    FROM PettingZoo pz WHERE pz.animalType = 'GOAT' AND 
     (
      pz.animalType.color = 'BROWN' or 
      pz.animalType.color = 'BLACK' or 
      pz.animalType.color = 'GREY' 
     ) 
    WHERE pz.animalType is not null 
+0

這很好,但我覺得如果使用索引,UNION ALL可能會更快。 – Codeman 2015-02-17 22:48:29

+0

Oracle是否將union的多重選擇優化爲一次掃描?但是,當然案件將會消失。 – 2015-02-17 22:49:34

+0

關於AND子句的問題:如果這3種顏色是唯一的選擇,那麼我需要它嗎? – 2015-02-18 15:32:18

1

可以使用組通過讓所有的計數在一個查詢:

SELECT 
     pz.animalType.color, COUNT(*) 
FROM PettingZoo pz 
WHERE pz.animalType = 'GOAT' 
GROUP BY pz.animalType.color 
1

我想凱文忘記了組由條款:

SELECT pz.animalType.color, COUNT(*) FROM PettingZoo pz WHERE 
pz.animalType = 'GOAT' GROUP BY pz.animalType.color; 
+0

的確,感謝您的糾正。 – 2015-02-18 00:34:51

相關問題