【发布时间】:2016-10-17 19:10:08
【问题描述】:
我有一个在 WebFocus 中创建的 ETL,并将其迁移到 Oracle。
我想要以下情况的替代方案。在 WebFocus 中,他可以使用之前计算的列,作为参数来计算另一个值。
例子:
SUM(CASE
WHEN T1.M2143831 > T1.M2460254
THEN
(T1.M2143831 * 100 / T1.M2143833)
ELSE
(T1.M2460254 * 100 / T1.M2460256)
END) AS TAXA_L,
SUM(CASE
WHEN T4.FABR_ID = 'TEST'
AND TAX_L >= 80
THEN 1
ELSE NULL
END) OVER80
例如,它使用上一步计算的TAX_L作为第二个case的参数,Oracle不能这样做。 我尝试如下:
SUM(CASE
WHEN T4.FABR_ID = 'TEST'
AND SUM(CASE
WHEN T1.M2143831 > T1.M2460254
THEN
(T1.M2143831 * 100 / T1.M2143833)
ELSE
(T1.M2460254 * 100 / T1.M2460256)
END) >= 80
THEN
1
ELSE
NULL
END)AS OVER80
但我收到以下错误:
ORA-00937: 不是单组群函数
这种情况的任何替代方案?
--- 原始查询/WebFocus 的一部分
SELECT T4.FABR_ID,
T3.REPORT_DATE_TIME,
T3.DAY_OF_WEEK,
T4.REGIONAL_ID,
T4.UF_ID,
T4.BSC_ID,
T2.COD_IBGE,
T4.BTS_ID,
SUM (T1.M2251827) AS CAP_ALLOC,
SUM(CASE
WHEN T1.M2143831 > T1.M2460254
THEN
(T1.M2143831 * 100 / T1.M2143833)
ELSE
(T1.M2460254 * 100 / T1.M2460256)
END)
AS TAX_L,
SUM (100 * T1.M2489212 / T1.M2489213) AS IUB_FRAME_LOST,
SUM (T1.M1979632 * T1.M1979630) AS NUM_ACE,
SUM (T1.M1977785 * T1.M1973189) AS DEN_ACE,
SUM (T1.M2225994) AS THROUGHPUT_IUB_DOWNLINK_E,
SUM( (T1.M2016166 + T1.M2016172 + T1.M1978319 + T1.M1978331)
* 8
/ 3600)
AS THROUGHPUT_DADOS_TOTAL_H,
SUM(CASE
WHEN T4.FABR_ID = 'TEST'
AND TAX_L >= 80
THEN
1
ELSE
NULL
END)
AS OVER80,
SUM(CASE
WHEN T4.FABR_ID = 'TEST'
AND TAX_L < 80
AND TAX_L IS NOT NULL
THEN
1
ELSE
NULL
END)
AS OVER80
FROM DBN1.F_BTS T1,
DBN1.DA_CADASTRO T2,
DBN1.D_TIME T3,
DBN1.D_ENTITY_BTS T4
WHERE (T2.AA_CADASTRO_KEY = T1.AA_CADASTRO_KEY)
AND (T3.TIME_KEY = T1.TIME_KEY)
AND (T4.ENTITY_KEY = T1.ENTITY_KEY)
AND (T2.COD_IBGE <> -1)
AND (T3.HOUR BETWEEN 08 AND 23)
AND (T3.REPORT_DATE_TIME BETWEEN TO_DATE ('27-09-2016 08:00:00',
'DD-MM-YYYY HH24:MI:SS')
AND TO_DATE ('27-09-2016 23:59:59',
'DD-MM-YYYY HH24:MI:SS'))
AND (T4.FABR_ID IN ('TEST1', 'TEST2'))
AND (T4.BTS_ID NOT IN ('', '*, -1'))
GROUP BY T4.FABR_ID,
T3.REPORT_DATE_TIME,
T3.DAY_OF_WEEK,
T4.REGIONAL_ID,
T4.UF_ID,
T4.BSC_ID,
T2.COD_IBGE,
T4.BTS_ID
ORDER BY T4.FABR_ID,
T3.REPORT_DATE_TIME,
T3.DAY_OF_WEEK,
T4.REGIONAL_ID,
T4.UF_ID,
T4.BSC_ID,
T2.COD_IBGE,
T4.BTS_ID;
【问题讨论】:
-
您可以发布正在使用的完整查询吗?显然你不能在另一个
sum中使用sum。 -
@vkp 查询范围很广,添加了一部分。我也有几个部分。
-
无论使用何种数据库,这似乎都没有任何意义。您按八列分组,并为每个组计算
TAX_L作为表T1中某些比率的SUM。然后,对于相同的 GROUPS,您想计算和 TAX_L >= 80的次数?条件应单独适用于每一行;对于 GROUP,该条件要么为真,要么对于整个组为假,而不是逐行。查询应该计算什么? (想想与您的问题相关的列和值。) -
@mathguy 此查询计算设备日志。每小时总览,累计。这些值将生成监控指标。我将删除总和并首先交付集群,然后是总和。