【问题标题】:Case SQL and count each row案例 SQL 并计算每一行
【发布时间】:2017-02-10 13:56:49
【问题描述】:

我如何才能获得以下所需的结果?我可以通过添加 DISTINCT 来获得所有独特的类别,但是在检索每个类别的 total 时,下面的查询不起作用。

表结构:BEER

ID | NAME | TYPE | ALCOHOL | 

要求的结果

category   |  total
----------------------------
Light      | 34
Medium     | 2
Normal     | 3
Heavy      | 4
Knock out  | 5

我的 SQL 查询:

SELECT 
   CASE WHEN b.ALCOHOL < 3 THEN 'Light'
        WHEN b.ALCOHOL < 5 THEN 'Medium'
        WHEN b.ALCOHOL < 7 THEN 'Normal'
        WHEN b.ALCOHOL < 9 THEN 'Heavy'
        WHEN b.ALCOHOL >= 9 THEN 'Knock out'
   END AS category
FROM BEER b;

谁能指引我正确的方向?

【问题讨论】:

  • 你也需要一个 GROUP BY。
  • 什么是总列?是计数(*)吗?

标签: sql oracle count group-by


【解决方案1】:

您需要count()group by。我使用 CTE 来避免残酷的group by

with CTE as
(
SELECT 
   CASE WHEN b.ALCOHOL < 3 THEN 'Light'
            WHEN b.ALCOHOL < 5 THEN 'Medium'
                WHEN b.ALCOHOL < 7 THEN 'Normal'
                WHEN b.ALCOHOL < 9 THEN 'Heavy'
                WHEN b.ALCOHOL >= 9 THEN 'Knock out'
   END AS category,
   b.Alcohol
     FROM BEER b
)
select category, count(alcohol)
from CTE
group by category

【讨论】:

    【解决方案2】:

    添加计数和分组方式:

    SELECT Category, COUNT(*) AS Total FROM (
      SELECT 
        CASE WHEN b.ALCOHOL < 3 THEN 'Light'
             WHEN b.ALCOHOL < 5 THEN 'Medium'
             WHEN b.ALCOHOL < 7 THEN 'Normal'
             WHEN b.ALCOHOL < 9 THEN 'Heavy'
             ELSE 'Knock out'
        END AS Category
      FROM BEER) b
    GROUP BY Category
    

    子查询用于简化GROUP BY,因为Oracle不支持GROUP BY 1语法。

    还要注意CASE中更简单的ELSE

    【讨论】:

    • Oracle 不支持GROUP BY 1,唉,要是支持就好了
    • 如果 Beer.Alcohol 为空会怎样?
    • 派生表,我这里的第一选择!
    • @apc 我刚刚花了几分钟在谷歌上搜索了这一点,遗憾的是这是真的。放弃 oracle 的另一个原因。
    • @john 我的蜘蛛侠直觉告诉我该专栏是NOT NULL :)
    【解决方案3】:

    您可以在CASE 上申请GROUP BY 并找到COUNT

    SELECT 
       CASE WHEN b.ALCOHOL < 3 THEN 'Light'
            WHEN b.ALCOHOL < 5 THEN 'Medium'
            WHEN b.ALCOHOL < 7 THEN 'Normal'
            WHEN b.ALCOHOL < 9 THEN 'Heavy'
            WHEN b.ALCOHOL >= 9 THEN 'Knock out'
       END AS category,
       count(*) total
    FROM BEER b
    GROUP BY 
        CASE WHEN b.ALCOHOL < 3 THEN 'Light'
            WHEN b.ALCOHOL < 5 THEN 'Medium'
            WHEN b.ALCOHOL < 7 THEN 'Normal'
            WHEN b.ALCOHOL < 9 THEN 'Heavy'
            WHEN b.ALCOHOL >= 9 THEN 'Knock out'
       END;
    

    【讨论】:

      【解决方案4】:

      使用具有相同条件的聚合函数以及group bylike

      sum(CASE WHEN b.ALCOHOL < 3 THEN 1 else 0 end)
      ....
      from tbl1
      group by some_col
      

      【讨论】:

        猜你喜欢
        • 2017-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        相关资源
        最近更新 更多