繁体   English   中英

带有case语句的Oracle SQL分组错误

[英]Oracle SQL grouping error with case statements

我需要基于过滤器动态计算一些值,该过滤器将在其他应用程序中设置。

但是我无法使查询正常工作。

如果使用以下代码, ORA-00937 "not a single-group group function"收到ORA-00937 "not a single-group group function"错误:

SELECT
--Dimensions:
  --VALUES_FOR_TABLEAU_METADATA:
    SHIFT_UUID,
--Measures (KPI's):
  --Count:
    SUM(COUNT_IO),
    SUM(COUNT_TARGET_OEE),
  --OEE:
    SUM(CASE 
        WHEN TIME_IO = 0 
        OR TIME_TARGET_OEE_100 = 0
        THEN NULL 
        ELSE SUM(TIME_IO)*100/SUM(TIME_TARGET_OEE_100) END) AS OEE,
  --POT:
    SUM(TIME_TARGET_OEE_100_FILTERED)
FROM VALUES_FOR_TABLEAU_METADATA
WHERE
  COUNT_TARGET_OEE != 0
GROUP BY SHIFT_UUID

这样可以实现,我丢失了GROUP BY一些值,但是我无法弄清楚哪个值。

我也尝试了在没有GROUP BY情况下执行查询时会发生什么,然后得到ORA-00978 "nested group function without GROUP BY"错误,这意味着我需要添加一个可以对CASE语句进行分组的值。 但是,在GROUP BY也使用CASE的值进行查询,这再次给了我ORA-00937

我也考虑过做一个嵌套的请求,但是不确定该请求是否仍然可以是动态的。

预先感谢您的帮助。

您错过了分组依据中的以下案例陈述:

FPY FTY for PR

将它们包括在group by ..中,或者对这些case语句使用单独的子查询。

该错误是由于嵌套的SUM()调用引起的,但是您似乎不需要它们:

SELECT
--Dimensions:
  --VALUES_FOR_TABLEAU_METADATA:
    SHIFT_UUID,
--Measures (KPI's):
  --Count:
    SUM(COUNT_IO),
    SUM(COUNT_TARGET_OEE),
  --OEE:
    100 * SUM(CASE 
        WHEN TIME_IO = 0 
        OR TIME_TARGET_OEE_100 = 0
        THEN 0 
        ELSE TIME_IO/TIME_TARGET_OEE_100 END) AS OEE,
  --POT:
    SUM(TIME_TARGET_OEE_100_FILTERED)
FROM VALUES_FOR_TABLEAU_METADATA
WHERE
  COUNT_TARGET_OEE != 0
GROUP BY SHIFT_UUID

我将100 *移到了SUM() ,并使ELSE表达式仅将该行的两个值相除。 我也将THEN NULL更改为THEN 0因为具有任何null值将使整个总和为null。 也许这就是您想要的,但是您似乎只需要/想要跳过那些会导致被零除错误的代码。 (排除TIME_IO = 0也是没有必要的,因为这不会出错)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM