关于DB2的联盟帮助

时间:2016-02-15 14:28:16

标签: sql db2 union

我正在尝试合并两个查询以显示前5个客户代码,但我一直收到错误SQLSTATE 42601。 理想情况下,我希望查询显示类似的内容。

LTIHONIA CLIENT 1 1330
LITHOINA CLIENT 2 1300
LITHONIA CLIENT 3 1000
ATHENS CLIENT 1 1330
ATHENS CLIENT 2 1000
ATHENS CLIENT 3 400 
SELECT 'LITHONIA' AS TYPE,  CLIENT_ID, ROUND(DEC(SUM(ORIG_AMT)),2) AS REVENUE FROM AR_SUM AR, TLORDER WHERE AGING_DATE >= '1/1/2016' AND AR.BILL_NUMBER = TLORDER.BILL_NUMBER 
AND CURRENT_STATUS IN ('BILLD','EDIBILLED') AND ORIG_AMT > 0 AND AR.SITE_ID = 'SITE1' 
GROUP BY CLIENT_ID
ORDER BY REVENUE DESC 
FETCH FIRST 5 ROWS ONLY
UNION 
SELECT 'LITHONIA' AS TYPE,  CLIENT_ID, ROUND(DEC(SUM(ORIG_AMT)),2) AS REVENUE FROM AR_SUM AR, TLORDER WHERE AGING_DATE >= '1/1/2016' AND AR.BILL_NUMBER = TLORDER.BILL_NUMBER 
AND CURRENT_STATUS IN ('BILLD','EDIBILLED') AND ORIG_AMT > 0 AND AR.SITE_ID = 'SITE10' 
GROUP BY CLIENT_ID
ORDER BY REVENUE DESC 
FETCH FIRST 5 ROWS ONLY

2 个答案:

答案 0 :(得分:0)

尝试在子查询周围使用括号:

(SELECT 'LITHONIA' AS TYPE,  CLIENT_ID, ROUND(DEC(SUM(ORIG_AMT)),2) AS REVENUE
 FROM AR_SUM AR JOIN
      TLORDER
      ON  AR.BILL_NUMBER = TLORDER.BILL_NUMBER
 WHERE AGING_DATE >= '1/1/2016' AND CURRENT_STATUS IN ('BILLD','EDIBILLED') AND ORIG_AMT > 0 AND AR.SITE_ID = 'SITE1' 
 GROUP BY CLIENT_ID
 ORDER BY REVENUE DESC 
 FETCH FIRST 5 ROWS ONLY
) UNION 
(SELECT 'LITHONIA' AS TYPE,  CLIENT_ID, ROUND(DEC(SUM(ORIG_AMT)),2) AS REVENUE  
 FROM AR_SUM AR JOIN
      TLORDER
      ON AR.BILL_NUMBER = TLORDER.BILL_NUMBER 
 WHERE AGING_DATE >= '1/1/2016' AND 
       CURRENT_STATUS IN ('BILLD','EDIBILLED') AND ORIG_AMT > 0 AND AR.SITE_ID = 'SITE10' 
 GROUP BY CLIENT_ID
 ORDER BY REVENUE DESC 
 FETCH FIRST 5 ROWS ONLY
)

此外,您应该学会使用正确的显式JOIN语法。简单规则:从不FROM子句中使用逗号。并且,UNION ALL可能比UNION更合适,除非您打算删除重复项。

答案 1 :(得分:0)

@OVO

由于order by子句,我确信您的查询有错误42601。你不能在联合查询中拥有它。 从sqls&中删除order by by子句。然后像bla bla那样从(你的UNION SQL)订单中选择字段。