【问题标题】:"INVALID USE OF AN AGGREGATE FUNCTION OR OLAP FUNCTION" ERROR IN DB2DB2 中的“无效使用聚合函数或 OLAP 函数”错误
【发布时间】:2014-09-15 15:07:37
【问题描述】:

我在下面附上了我的代码供您查看。我的错误来自第四个 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

【问题讨论】:

  • 但是您在GROUP BY 中使用了SUM(),这是行不通的。您能否尝试解释您的目标并将查询减少到相关子句。

标签: sql db2


【解决方案1】:

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

如果我正确理解您的意图,您可能打算在您的第四个 CASE 中这样做:

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 的参数。

【讨论】:

    【解决方案2】:

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

    希望对你有帮助。

    【讨论】:

    • 那里需要 SUM 函数,我将解释原因。如果什么都不存在,Q.AMOUNT 将为空。但是,如果存在数据,则 Q.AMOUNT 可以有多个行项目。因此,我需要该列的总和 + Z.AMOUNT。希望这是有道理的。
    【解决方案3】:

    从 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
    

    【讨论】:

    • 当我这样做时,我收到以下错误 - 在 SELECT 子句、HAVING 子句或 ORDER BY 子句中指定的以“AMOUNT”开头的表达式未在 GROUP BY 子句中指定,或者它位于带有列函数且未指定 GROUP BY 子句的 SELECT 子句、HAVING 子句或 ORDER BY 子句。
    • 您需要确定要分组的字段以及要使用聚合函数计算的字段。我真的不知道您要达到哪种粒度。
    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2014-09-05
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多