Sql &引用;聚合函数或OLAP函数的使用无效;DB2中的错误

Sql &引用;聚合函数或OLAP函数的使用无效;DB2中的错误,sql,db2,Sql,Db2,我在下面附上了我的代码供您审阅。我的错误出现在第四个案例中,我使用数学函数来计算信息。有人知道是什么导致了错误,以及如何避免错误吗?我猜问题在我最后的功能顺序中 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

我在下面附上了我的代码供您审阅。我的错误出现在第四个案例中,我使用数学函数来计算信息。有人知道是什么导致了错误,以及如何避免错误吗?我猜问题在我最后的功能顺序中

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

在第四种情况下,没有使用额外的
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"

希望这对您有所帮助。

从组中删除以下内容:

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

问题是您试图在选择中引用单个和聚合的
Q.AMOUNT

如果我正确理解您的意图,您可能打算对您的第四个案例执行此操作:

Y.CHGS - (COALESCE(SUM(Q.AMOUNT), 0) +  Z.AMOUNT) AS "LL"
如果组中的每个
Q.AMOUNT
都为空,
SUM(Q.AMOUNT)
也将为空,并替换为零,这将使表达式实质上等同于
Y.CHGS-Z.AMOUNT

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


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

这里需要SUM函数,我将解释原因。如果不存在,金额将为空。但是,如果存在数据,Q.AMOUNT可以有多个行项目。因此,我需要该列的总和+Z.AMOUNT。希望这是有意义的。但是您在
分组方式中使用
SUM()
,这将不起作用。请您尝试解释您的目标,并将查询简化为相关子句。当我这样做时,我得到以下错误-在GROUP BY子句中未指定以SELECT子句、HAVING子句或ORDER BY子句中指定的“AMOUNT”开头的表达式,或者在SELECT子句、HAVING子句中未指定该表达式,或带有列函数的ORDER BY子句,但未指定GROUP BY子句。您需要决定要根据哪些字段进行分组,以及要使用聚合函数计算哪些字段。我真的不知道你想要达到哪种粒度。