【问题标题】:How to use a WINDOW function with a CASE statement in Oracle SQL如何在 Oracle SQL 中使用带有 CASE 语句的 WINDOW 函数
【发布时间】:2021-11-30 09:21:02
【问题描述】:

我正在尝试在 ORACLE SQL 中使用 CASE 按组来SUM 数量,但这似乎不起作用:

SUM(A11.NEW_MRP_QTY) OVER (CASE WHEN A11.STOCK_TYPE = 'C' THEN 'INVENTORY'
         WHEN A11.STOCK_TYPE = 'L' THEN 'INTRANSIT PO'
         WHEN A11.STOCK_TYPE = 'B' THEN 'PO AT FACTORY'
         WHEN (A11.STOCK_TYPE = 'A' AND A11.POR_ORDER_TYPE = 'CO') THEN 'PO AT FACTORY'
         WHEN (A11.STOCK_TYPE = 'A' AND A11.POR_ORDER_TYPE <> 'CO') THEN 'NOT BOUGHT'
         WHEN A11.STOCK_TYPE = ' ' THEN 'BLANK STOCK TYPE'
         ELSE 'CHECK')
    END AS 'SUPPLY_QTY'

关于我做错了什么有什么想法吗?谢谢。

【问题讨论】:

  • case 表达式没有end。
  • 'SUPPLY_QTY' 是字符串文字,而不是标识符。请改用双引号。
  • 这个问题似乎没有包含足够的信息来说明什么似乎不起作用。请描述您遇到的错误并仔细检查语法。

标签: sql oracle oracle10g


【解决方案1】:

这就是您现在所拥有的(稍微简化并应用于 Scott 的示例 emp 表,因为我没有您的表,也没有您发布任何示例数据):

SQL> select sum(sal) over (case when deptno = 10 then 'A'
  2                             when deptno = 20 then 'B'
  3                             else 'C'
  4                        end) as supply_qty
  5  from emp;
select sum(sal) over (case when deptno = 10 then 'A'
                      *
ERROR at line 1:
ORA-00907: missing right parenthesis


SQL>

为什么会出错?因为over的部分功能是错误的。它不能只有case 表达式,您缺少partition by 和/或order by(参见第1 行),例如

SQL> select sum(sal) over (partition by case when deptno = 10 then 'A'
  2                                          when deptno = 20 then 'B'
  3                                          else 'C'
  4                                     end) as supply_qty
  5  from emp;

SUPPLY_QTY
----------
      8750
      8750
      8750
     10875
     10875
     10875
     10875
     10875
      9400
      9400
      9400
      9400
      9400
      9400

14 rows selected.

SQL>

我不知道你在这里要做什么,但上面至少应该为你指明正确的方向(以及人们发布的 cmets)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 2023-02-07
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多