【发布时间】:2018-07-18 19:35:31
【问题描述】:
我有一个查询需要动态更改我执行ROLLUPon 的列。
所以这里是示例数据:
+-----------+---------+-------+--------+-------+----------------------------+
|Location_ID|PLANT | ... |COUNT_IO|TIME_IO|TIME_TARGET_OEE_100_FILTERED|
+-----------+---------+-------+--------+-------+----------------------------+
|01105123000|1 | ... |10 |50 |75 |
+-----------+---------+-------+--------+-------+----------------------------+
|01105123001|1 | ... |13 |65 |75 |
+-----------+---------+-------+--------+-------+----------------------------+
|01105123002|1 | ... |15 |75 |65 |
+-----------+---------+-------+--------+-------+----------------------------+
|01105123003|1 | ... |13 |65 |75 |
+-----------+---------+-------+--------+-------+----------------------------+
|01101113001|2 | ... |40 |200 |400 |
+-----------+---------+-------+--------+-------+----------------------------+
|01101113002|2 | ... |20 |100 |400 |
+-----------+---------+-------+--------+-------+----------------------------+
所需的输出(ROLLUP 上 LOCATION_ID):
+-----------+---------+-------+--------+-------+
|Location_ID|PLANT | ... |COUNT_IO|OEE |
+-----------+---------+-------+--------+-------+
|01105123000|1 | ... |10 |66,66 |
+-----------+---------+-------+--------+-------+
|01105123001|1 | ... |13 |86,66 |
+-----------+---------+-------+--------+-------+
|01105123002|1 | ... |15 |115,38 |
+-----------+---------+-------+--------+-------+
|01105123003|1 | ... |13 |86,66 |
+-----------+---------+-------+--------+-------+
|NULL |1 | ... |51 |87,93 |
+-----------+---------+-------+--------+-------+
所需的输出(ROLLUP 上 PLANT):
+-----------+---------+-------+--------+-------+
|Location_ID|PLANT | ... |COUNT_IO|OEE |
+-----------+---------+-------+--------+-------+
|01105123000|1 | ... |51 |87,93 |
+-----------+---------+-------+--------+-------+
|01105123001|1 | ... |51 |87,93 |
+-----------+---------+-------+--------+-------+
|01105123002|1 | ... |51 |87,93 |
+-----------+---------+-------+--------+-------+
|01105123003|1 | ... |51 |87,93 |
+-----------+---------+-------+--------+-------+
|01101113001|2 | ... |60 |37,5 |
+-----------+---------+-------+--------+-------+
|01101113002|2 | ... |60 |37,5 |
+-----------+---------+-------+--------+-------+
|... |NULL | ... |111 |50,92 |
+-----------+---------+-------+--------+-------+
示例代码:
SELECT
--Dimensions:
--VALUES_FOR_TABLEAU_METADATA:
DISTINCT LOCATION_ID,
CONTINENT,
COUNTRY,
PLANT,
BUSINESS_UNIT,
PRODUCT,
--Measures (KPI's):
--Count:
CASE
WHEN <Parameters.BU> = '%' AND <Parameters.Plant> = '%' THEN SUM(COUNT_IO) OVER (PARTITION BY BUSINESS_UNIT)
WHEN <Parameters.BU> != '%' AND <Parameters.Plant> = '%' THEN SUM(COUNT_IO) OVER (PARTITION BY PLANT)
ELSE SUM(COUNT_IO) OVER (PARTITION BY LOCATION_ID)
END AS "COUNT_IO",
--OEE:
CASE
WHEN TIME_IO = 0 OR TIME_TARGET_OEE_100 = 0
THEN 0
ELSE
CASE
WHEN <Parameters.BU> = '%' AND <Parameters.Plant> = '%' THEN SUM(TIME_IO) OVER (PARTITION BY BUSINESS_UNIT) *100/SUM(TIME_TARGET_OEE_100_FILTERED) OVER (PARTITION BY BUSINESS_UNIT)
WHEN <Parameters.BU> != '%' AND <Parameters.Plant> = '%' THEN SUM(TIME_IO) OVER (PARTITION BY PLANT) *100/SUM(TIME_TARGET_OEE_100_FILTERED) OVER (PARTITION BY PLANT)
ELSE SUM(TIME_IO) OVER (PARTITION BY LOCATION_ID) *100/SUM(TIME_TARGET_OEE_100_FILTERED) OVER (PARTITION BY LOCATION_ID)
END
END AS "OEE"
FROM VALUES_FOR_TABLEAU_METADATA
WHERE
COUNT_TARGET_OEE != 0 AND PLANT LIKE <Parameters.Plant> AND BUSINESS_UNIT LIKE <Parameters.BU> AND LOCATION_ID LIKE <Parameters.LocationID> AND WORKING_DAY BETWEEN <Parameters.WorkingDay_Start> AND <Parameters.WorkingDay_End>
GROUP BY
CASE
WHEN <Parameters.BU> = '%' AND <Parameters.Plant> = '%' THEN LOCATION_ID
WHEN <Parameters.BU> != '%' AND <Parameters.Plant> = '%' THEN LOCATION_ID
ELSE ROLLUP(LOCATION_ID)
END,
CASE
WHEN <Parameters.BU> = '%' AND <Parameters.Plant> = '%' THEN PLANT
WHEN <Parameters.BU> != '%' AND <Parameters.Plant> = '%' THEN ROLLUP(PLANT)
ELSE PLANT
END,
CASE
WHEN <Parameters.BU> = '%' AND <Parameters.Plant> = '%' THEN ROLLUP(BUSINESS_UNIT)
WHEN <Parameters.BU> != '%' AND <Parameters.Plant> = '%' THEN BUSINESS_UNIT
ELSE BUSINESS_UNIT
END,
CONTINENT, COUNTRY, PRODUCT, COUNT_IO, COUNT_TARGET_OEE, TIME_IO, TIME_TARGET_OEE_100, TIME_TARGET_OEE_100_FILTERED
我猜这个问题是由CASE 语句中的ROLLUP 引起的,因为直到GROUP BY 的代码工作正常。我也不太确定我的CASE 语句的使用是否正确。
这些参数可能看起来很奇怪,但它们用于 Tableau 并且工作正常。
我得到的错误是:
ORA-00904:“ROLLUP”:标识符无效
【问题讨论】:
-
向我们展示示例数据集和预期结果。可能有更简单的方法来完成您最终想要实现的目标。
-
@KaushikNayak 抱歉,如果可以理解的话,我花了一段时间添加示例数据...
-
rollup关键字必须超出case表达式。 -
@WilliamRobertson 所以没有办法执行动态
ROLLUP? -
是的,但只能通过编写返回聚合键的
case表达式来允许您想要的汇总,或者通过在比您需要的更多级别上汇总并以某种方式在最后进行过滤。不过,我还没有处理过你复杂的 mcve,所以我无法建议如何做到这一点。
标签: sql oracle case tableau-api rollup