DB2中“无效使用集合函数或OLAP函数”错误

时间:2014-09-15 15:07:37

标签: sql db2

我已在下面附上我的代码供您审核。我的错误来自第4个CASE语句,我使用数学函数来计算信息。有谁知道导致错误的原因以及如何绕过它?我猜这个问题最后是我的ORDER BY函数。

SELECT
H.DATE AS "DATE"
,TRIM(H.NUMBER) AS "NUMBER"
,CASE WHEN TT.RY_DATE IS NULL THEN '' ELSE CHAR(TT.RY_DATE) END AS "RY DATE"
,CASE WHEN T.PT_DATE = '0001-01-01' THEN 'N' ELSE 'Y' END AS "PT"
,T.ON AS "ON"
,CASE WHEN H.CLASS = '0.00' THEN H.CLASS ELSE H.RATED END AS "CLASS"
,SUBSTR(TRIM(S.NAME), 1, LENGTH(TRIM(S.NAME))-2) AS "CITY"
,H.STATE AS "STATE"
,H.ZIPCODE AS "ZIP"
,SUBSTR(TRIM(CN.NAME), 1, LENGTH(TRIM(CN.NAME))-2) AS "DCITY"
,H.STATE AS "DSTATE"
,H.ZIPCODE AS "DZIP"
,H.WGT AS "WEIGHT"
,CASE 
WHEN Q.AMOUNT IS NULL THEN (Y.CHGS - Z.AMOUNT)
WHEN Q.AMOUNT IS NOT NULL THEN (Y.CHGS - (SUM(Q.AMOUNT +  Z.AMOUNT))) ELSE ''
END AS "LL"
,Z.AMOUNT AS "FU"
,SUM(Q.AMOUNT) AS "AC"
,Y.CHGS AS "CHARGES"

FROM A.COST H

INNER JOIN A.MASTER S
ON H.CITY = S.CITY

INNER JOIN A.MASTER CN
ON H.CITY = CN.CITY

INNER JOIN A.SPEC Z
ON Z.NUMBER = H.NUMBER
AND Z.DATE = H.DATE
AND Z.TYPE = 'F'

INNER JOIN A.ALT Y
ON Y.NUMBER = H.NUMBER
AND Y.DATE = H.DATE

LEFT OUTER JOIN A.SPEC. Q
ON Q.NUMBER = H.NUMBER
AND Q.DATE = H.DATE
AND Q.TYPE = 'S'

LEFT OUTER JOIN A.T TT
ON H.NUMBER = TT.NUMBER

LEFT OUTER JOIN A.TIME T
ON T.NUMBER = H.NUMBER

WHERE H.CTRL = '000000'
AND (MONTH(CURRENT DATE)-1) = MONTH(H.DATE)
AND H.DATE > CURRENT DATE - 90 DAYS

GROUP BY
H.DATE 
,TRIM(H.NUMBER)
,CASE WHEN TT.D_DATE IS NULL THEN '' ELSE CHAR(TT.D_DATE) END
,CASE WHEN T.PT_DATE = '0001-01-01' THEN 'N' ELSE 'Y' END
,T.ON
,CASE WHEN H.CLASS = '0.00' THEN H.CLASS ELSE H.RATED END
,SUBSTR(TRIM(S.NAME), 1, LENGTH(TRIM(S.NAME))-2)
,H.STATE
,H.ZIPCODE 
,SUBSTR(TRIM(CN.NAME), 1, LENGTH(TRIM(CN.NAME))-2)
,H.STATE 
,H.ZIPCODE 
,H.WGT 
,CASE WHEN Q.AMOUNT IS NULL THEN (Y.CHGS - Z.AMOUNT)
WHEN Q.AMOUNT IS NOT NULL THEN (Y.CHGS - (SUM(Q.AMOUNT + Z.AMOUNT))) END
,Z.AMOUNT 
,Y.CHGS

ORDER BY DATE

3 个答案:

答案 0 :(得分:1)

问题是您尝试在SELECT中引用单个和聚合的Q.AMOUNT值。

如果我理解你的意图正确,你可能打算用你的第四个案例来做这件事:

Y.CHGS - (COALESCE(SUM(Q.AMOUNT), 0) +  Z.AMOUNT) AS "LL"

如果组中的每个Q.AMOUNT都为NULL,SUM(Q.AMOUNT)也将为NULL并替换为零,这将使表达式基本上等同于Y.CHGS - Z.AMOUNT

您不需要在GROUP BY中重复此表达式,因为其中的所有引用都已经是GROUP BY条件或正在聚合。

COALESCE函数接受多个参数并返回第一个不为NULL的参数。

答案 1 :(得分:0)

在第四种情况下,不使用额外的SUM功能。尝试这样的事情: -

CASE 
WHEN Q.AMOUNT IS NULL THEN (Y.CHGS - Z.AMOUNT)
WHEN Q.AMOUNT IS NOT NULL THEN (Y.CHGS - Q.AMOUNT +  Z.AMOUNT) 
ELSE ''
END AS "LL"

希望这对你有所帮助。

答案 2 :(得分:0)

从GROUP BY中删除以下内容:

CASE WHEN Q.AMOUNT IS NULL THEN (Y.CHGS - Z.AMOUNT)
WHEN Q.AMOUNT IS NOT NULL THEN (Y.CHGS - (SUM(Q.AMOUNT + Z.AMOUNT))) END