[英]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.