2015-02-17 120 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

相关问题