2017-07-27 110 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列与其他列相匹配,但它似乎仍将它们分开作为它们自己的行 –