【问题标题】:How do I use Group By based on a Case statement in Oracle?如何根据 Oracle 中的 Case 语句使用 Group By?
【发布时间】:2012-07-04 17:34:35
【问题描述】:

我有一个 SQL 查询,我使用 Oracle CASE 来比较日期列是小于还是大于当前日期。但是我如何在GROUP BY-statement 中使用CASE-statement?我想统计每种情况下的记录。

例如

select
    (case
        when exp_date > sysdate then 1
        when exp_date <= sysdate then 2
        else 3
     end) expired, count(*)
from mytable
group by expired

但尝试此操作时出现错误:ORA-00904。有什么建议吗?

【问题讨论】:

标签: sql oracle group-by case


【解决方案1】:

使用内联视图:

SELECT expired,
       count(*)
  FROM (SELECT (CASE
                   WHEN exp_date > SYSDATE THEN 1
                   WHEN exp_date <= SYSDATE THEN 2
                   ELSE 3
                 END) AS expired
          FROM mytable)
GROUP BY expired;

希望对你有帮助...

【讨论】:

    【解决方案2】:
    select
    (case
        when exp_date > sysdate then 1
        when exp_date <= sysdate then 2
        else 3
     end) expired, count(*)
    from mytable
    group by (case
        when exp_date > sysdate then 1
        when exp_date <= sysdate then 2
        else 3
     end)
    

    【讨论】:

    • 在性能方面与内嵌视图有什么区别?
    • 我不确定。将取决于 oracle 是否评估 CASE 两次。您可以使用EXPLAIN PLAN 进行检查。无论如何,事后看来,我可能会选择@Ollie 的答案,因为我认为没有重复逻辑的 SQL 看起来会更好
    • 如果我要1,2,3作为列头怎么办,sql应该怎么写?
    【解决方案3】:

    作为附加输入,虽然它与此线程无关,但您也可以汇总您的案例陈述,而无需在 group by 子句中提及。

    SELECT
       WORK_ORDER_NUMBER,
       SUM(CASE WHEN STOCK_CODE LIKE 'xxxx' THEN STOCK_QUANTITY ELSE 0 END) AS TOTAL
    FROM Table
    GROUP BY WORK_ORDER_NUMBER;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多