2017-07-27 113 views
-1

我有一個很好的sql查詢,直到我嘗試實現group by子句。目前它正在獲取我要求的所有行,但他們需要進行其他分組,我有太多的行。但是,一旦我添加了一個組,即使它只是按一列進行分組,sql也會完全崩潰。 任何幫助將不勝感激。SQL組通過case語句崩潰

SQL當前錯誤消息爲:

執行數據庫查詢時出錯。

[Sybase] [SequeLink JDBC驅動程序] [ODBC套接字] [IBM] [iSeries Access ODBC驅動程序] [DB2 UDB] SQL0122 - SELECT列表中的列QDSHDT或表達式無效。

而就像我之前提到的沒有group by子句一樣,這個錯誤完全消失,查詢運行正常。

SELECT Distinct 'SJ' as JOURNAL, 
     BLNDTA.bln525l1.bclnt, 
     (substr(digits(dtalib.odmastl1.QDSHDT),1,2) || substr(digits(dtalib.odmastl1.QDSHDT),3,2)) as YEAR, 
     substr(digits(dtalib.odmastl1.QDSHDT),5,2) as shpmm, 
     CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN QDAMTBL ELSE 0.0 END as qdamtbl, 
     CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDAWP + dtalib.odmastl1.QDPFEE + dtalib.odmastl1.QDSHIP3 ELSE 0.0 END) + qdadjamt ELSE 0.0 END as NETSALE, 
     CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDCOPAY+dtalib.odmastl1.QDCPAY2 + dtalib.odmastl1.QDDEDCT ELSE 0.0 END as PATRESP, 
     CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDAWP + dtalib.odmastl1.QDPFEE + dtalib.odmastl1.QDSHIP3 ELSE 0.0 END) + qdadjamt ELSE 0.0 END) + QDSLTAX - (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDCOPAY+dtalib.odmastl1.QDCPAY2 + dtalib.odmastl1.QDDEDCT ELSE 0.0 END) ELSE 0.0 END as prxtot, 
     CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN qdamtpd ELSE 0.0 END as qdamtpd, 
     (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDAWP + dtalib.odmastl1.QDPFEE + dtalib.odmastl1.QDSHIP3 ELSE 0.0 END) + qdadjamt ELSE 0.0 END)+qdsltax-(CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDCOPAY+dtalib.odmastl1.QDCPAY2 + dtalib.odmastl1.QDDEDCT ELSE 0.0 END)-qdamtpd as CLTBALDUE, 
     CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN qdcost ELSE 0.0 END as qdcost, 
     CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDAWP + dtalib.odmastl1.QDPFEE + dtalib.odmastl1.QDSHIP3 ELSE 0.0 END) + qdadjamt - qdcost ELSE 0.0 END as gp, 
     CASE WHEN dtalib.odmastl1.qdbatch=bln525l1.bbatch THEN 1 ELSE 0.0 END as OrderCnt, 
     CASE WHEN bln525l1.brjrsn <> ' ' THEN 1.0 ELSE 0.0 END as DenialCnt, 
     CASE WHEN bln525l1.brjrsn <> ' ' THEN 1.0 ELSE 0.0 END as Reshipcnt, 
     CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch and (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDAWP + dtalib.odmastl1.QDPFEE + dtalib.odmastl1.QDSHIP3 ELSE 0.0 END) + qdadjamt ELSE 0.0 END) + QDSLTAX - (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDCOPAY+dtalib.odmastl1.QDCPAY2 + dtalib.odmastl1.QDDEDCT ELSE 0.0 END) ELSE 0.0 END) <> 0 THEN 1.0 
      WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch and (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDAWP + dtalib.odmastl1.QDPFEE + dtalib.odmastl1.QDSHIP3 ELSE 0.0 END) + qdadjamt ELSE 0.0 END) + QDSLTAX - (CASE WHEN dtalib.odmastl1.qdbatch = bln525l1.bbatch THEN dtalib.odmastl1.QDCOPAY+dtalib.odmastl1.QDCPAY2 + dtalib.odmastl1.QDDEDCT ELSE 0.0 END) ELSE 0.0 END) = 0 THEN 0.0 ELSE NULL END as Shortpd 



FROM  dtalib.odmastl1 



LEFT JOIN DTALIB.INV105L1 on (

     dtalib.odmastl1.qdndc5=DTALIB.INV105L1.indc5 
     and dtalib.odmastl1.qdndc4=DTALIB.INV105L1.indc4 
     and dtalib.odmastl1.qdndc2=DTALIB.INV105L1.indc2 
     and dtalib.odmastl1.qdgener=DTALIB.INV105L1.igener) 

LEFT JOIN blndta.gpi205l1 on (

     DTALIB.INV105L1.igpi=gpi205l1.ggpi) 

LEFT JOIN blndta.bln525l1 on (

     dtalib.odmastl1.qdordno=bln525l1.brxnum)  

LEFT JOIN dtalib.odmast4l1 on (

     dtalib.odmastl1.qdcocd=dtalib.odmast4l1.q4cocd 
     and dtalib.odmastl1.qdbrcd=dtalib.odmast4l1.q4brcd 
     and dtalib.odmastl1.qddvcd=dtalib.odmast4l1.q4dvcd 
     and dtalib.odmastl1.qdtrans=dtalib.odmast4l1.q4trans 
     and dtalib.odmastl1.qdline=dtalib.odmast4l1.q4line 
     and dtalib.odmastl1.qdprcgrp=dtalib.odmast4l1.q4group 
     and dtalib.odmastl1.qdprcclnt=dtalib.odmast4l1.q4clnt 
     and dtalib.odmastl1.qdfill##=dtalib.odmast4l1.Q4FILL##)    

LEFT JOIN dtalib.ohmast on (

     dtalib.odmastl1.qdcocd=dtalib.ohmast.qhcocd 
     and dtalib.odmastl1.qdbrcd=dtalib.ohmast.qhbrcd 
     and dtalib.odmastl1.qddvcd=dtalib.ohmast.qhdvcd 
     and dtalib.odmastl1.qdtrans=dtalib.ohmast.qhtrans) 


LEFT JOIN blndta.cst115l1 on (

     dtalib.ohmast.qhacct=cst115l1.acct 
     and dtalib.ohmast.qhadnum=cst115l1.adnum) 

WHERE  1=1 

     AND dtalib.odmastl1.QDSTATS IN('R3','70') 
     AND SUBSTR(DTALIB.INV105L1.igpi,1,4) NOT IN('9991') 
     AND QDMEDCD NOT IN('CASH','EDUCA','SRVC') 
     AND dtalib.odmastl1.QDSHDT BETWEEN '20170101' and '20991231' 
     AND dtalib.odmastl1.QDRSDT=0 

GROUP BY BLNDTA.bln525l1.bclnt, (substr(digits(dtalib.odmastl1.QDSHDT),1,2) || substr(digits(dtalib.odmastl1.QDSHDT),3,2)), substr(digits(dtalib.odmastl1.QDSHDT),5,2) 
+1

SQL不會「崩潰」。它可能會返回一個錯誤,如果你希望人們能夠幫助你,應該可能會報告你所看到的錯誤(錯誤代碼和確切的錯誤信息,理想情況下) –

+0

'(substr(digits(dtalib.odmastl1.QDSHDT), 1,2)|| substr(數字(dtalib.odmastl1.QDSHDT),3,2))'你是放棄還是分組條件? –

+0

@SagarGangwal - 這是一個串聯運算符。 SQL不是C.(或者C++,或者C#,或者Java或者JavaScript,或者...)\ –

回答

0

您是否簡單地選擇了組中的所有列?我不看它。

+0

這似乎是問題,我想我只是誤解了如何工作組,我想sql來分組行時前4列匹配並加起來其餘的列 –

+0

問題是,一旦某些列被分組(壓在一起),沒有辦法不將它們分組爲其他列。 – isaace

+0

當我試圖按照前四列進行分組時,這就是我的想法。我期待它能給我一些行,其中前4列與其他列相匹配,但它似乎仍將它們分開作爲它們自己的行 –