【问题标题】:Can you return multiple COUNTs in one SQL statement?你可以在一个 SQL 语句中返回多个 COUNT 吗?
【发布时间】:2015-02-17 22:39:20
【问题描述】:

我正在使用 Java 和 SQL,我正在尝试计算宠物动物园中的所有山羊。我知道我可以使用以下查询:

  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 次获得单个颜色。 有没有办法在 one 查询中返回所有四种颜色?

编辑:为了清楚起见,假设有 15 只山羊。 9 个是棕色的,0 个是黑色的,6 个是灰色的。第一个查询将返回 15。第二个查询将返回 9。第三个和最后一个查询将分别返回 0 和 6。我正在寻找一个同时返回所有四个值的值(所以我不是在四个不同的时间读取同一张表)。可能是数组? { 15, 9, 0, 6 }

【问题讨论】:

  • 你的意思是像 'GOAT' AND color in ('BROWN' ,'BLACK', 'GREY')?
  • 您是否想要不同的值,例如 - 棕色的值、黑色的值和灰色的值?

标签: java sql oracle-sqldeveloper


【解决方案1】:
  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

【讨论】:

  • 这很好,但我觉得如果使用索引,UNION ALL 可能会更快。
  • oracle 是否将联合的多项选择优化为一次扫描?但是当然情况会消失。
  • 关于 AND 子句的问题:如果这 3 种颜色是唯一的选择,而不是 null,我是否需要它?
  • 如果都是非空山羊,没关系。
【解决方案2】:

我认为 Kevin 忘记了 group by 子句:

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

【讨论】:

    【解决方案3】:

    您可以使用 group by 在一个查询中获取所有计数:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多