2016-03-18 58 views
0

我很难得到这个总和工作。我不确定是否在SELECT语句中使用Sum是因为我是Oracle SQL的新手。我试图找到应付总额大于客户信用额度的地方。甲骨文总结

SELECT ARCUSTO.CUSTNO, 
     ARCUSTO.COMPANY, 
     ARCUSTO.ID, 
     ARCUSTO.FAX_NUMBER, 
     ARCUSTO.STATUS_ID, 
     ARCUSTO.CREDIT_LIMIT, 
     ARCUSTO.ADDR1, 
     ARCUSTO.ADDR2, 
     ARCUSTO.ADDR3, 
     ARCUSTO.CITY, 
     ARCUSTO.STATE, 
     ARCUSTO.ZIP, 
     ARCUSTO.COUNTRY, 
     ARCUSTO.PHONE_NUMBER, 
     SUM(V_1_30_SUM.LEFT_TO_APPLY, V_30_60_SUM.LEFT_TO_APPLY, V_60_90_SUM.LEFT_TO_APPLY, V_90_SUM.LEFT_TO_APPLY, V_CURRENT_SUM.LEFT_TO_APPLY) Due 
FROM ((((IQMS.ARCUSTO ARCUSTO 
       LEFT OUTER JOIN IQMS.V_1_30_SUM V_1_30_SUM 
       ON ARCUSTO.ID=V_1_30_SUM.ARCUSTO_ID) 
      LEFT OUTER JOIN IQMS.V_30_60_SUM V_30_60_SUM 
      ON ARCUSTO.ID=V_30_60_SUM.ARCUSTO_ID) 
      LEFT OUTER JOIN IQMS.V_60_90_SUM V_60_90_SUM 
      ON ARCUSTO.ID=V_60_90_SUM.ARCUSTO_ID) 
     LEFT OUTER JOIN IQMS.V_90_SUM V_90_SUM 
     ON ARCUSTO.ID=V_90_SUM.ARCUSTO_ID) 
     LEFT OUTER JOIN IQMS.V_CURRENT_SUM V_CURRENT_SUM 
     ON ARCUSTO.ID=V_CURRENT_SUM.ARCUSTO_ID 
ORDER BY 
     ARCUSTO.CUSTNO, 
     ARCUSTO.ID, 
     ARCUSTO.COMPANY 
HAVING SUM(Due) > ARCUST.CREDIT_LIMIT 
+0

括号中的'FROM'子句中是无用的。 –

+0

如果您发布一个简单的独立示例,您可以更轻松地获得更准确的答案,并且您可以更容易地看到问题。您首先需要GROUP BY条件,然后才能使用HAVING运算符。 –

回答

1
  • SUM做不支持多个表达式。
  • 该条款的顺序是:WITH ... SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
  • 为了使用HAVING子句,如果存在非聚合列,则需要GROUP BY子句。
  • 不能使用WHEREHAVING子句中SELECT子句中定义的列别名。

喜欢的东西:

SELECT * 
FROM (
    SELECT A.*, 
     COALESCE((SELECT SUM(LEFT_TO_APPLY) FROM V_1_30_SUM WHERE A.ID = ARCUSTO_ID), 0) 
      + COALESCE((SELECT SUM(LEFT_TO_APPLY) FROM V_30_60_SUM WHERE A.ID = ARCUSTO_ID), 0) 
      + COALESCE((SELECT SUM(LEFT_TO_APPLY) FROM V_60_90_SUM WHERE A.ID = ARCUSTO_ID), 0) 
      + COALESCE((SELECT SUM(LEFT_TO_APPLY) FROM V_90_SUM  WHERE A.ID = ARCUSTO_ID), 0) 
      + COALESCE((SELECT SUM(LEFT_TO_APPLY) FROM V_CURRENT_SUM WHERE A.ID = ARCUSTO_ID), 0) AS Due 
    FROM IQMS.ARCUSTO A 
    ORDER BY 
     A.CUSTNO, 
     A.ID, 
     A.COMPANY 
) 
WHERE Due > Credit_Limit; 
+0

哇,这比我想象的要复杂得多。我很抱歉,我忘了发布错误。 @Ditto我得到一个错误“无效的SQL语句” -MT0我收到一个错误“SQL命令未正确结束” –

+0

@RyanShukis更新 – MT0

+0

非常感谢!完美的作品! –

0

你应该张贴你得到,我正在做一个假设,如果没有它,确切的错误..

你在那里需要一个GROUP BY ......和你HAVING不能引用列别名。 。你需要重新注明全部SUM .. 和ORDER BY最后。

所以您的最终作品应该是这样的:

GROUP BY ARCUSTO.CUSTNO, 
     ARCUSTO.COMPANY, 
     ARCUSTO.ID, 
     ARCUSTO.FAX_NUMBER, 
     ARCUSTO.STATUS_ID, 
     ARCUSTO.CREDIT_LIMIT, 
     ARCUSTO.ADDR1, 
     ARCUSTO.ADDR2, 
     ARCUSTO.ADDR3, 
     ARCUSTO.CITY, 
     ARCUSTO.STATE, 
     ARCUSTO.ZIP, 
     ARCUSTO.COUNTRY, 
     ARCUSTO.PHONE_NUMBER, 
    HAVING SUM(V_1_30_SUM.LEFT_TO_APPLY, V_30_60_SUM.LEFT_TO_APPLY, V_60_90_SUM.LEFT_TO_APPLY, V_90_SUM.LEFT_TO_APPLY, V_CURRENT_SUM.LEFT_TO_APPLY) 
       > ARCUST.CREDIT_LIMIT 
    ORDER BY 
     ARCUSTO.CUSTNO, 
     ARCUSTO.ID, 
     ARCUSTO.COMPANY 

试一下,看看它是否工作更好,如果没有,请张贴满 - 确切的错误信息