2017-05-31 70 views
0

我有一个相当大的查询在DB2服务器上运行。在那个查询中,我有一个包含20个选项的case语句。这个案例完美的工作,直到我试图在每个when子句中放置一个子查询。然后它给了我一个错误,我们不确定它发生在哪里。如何在DB2选择案例中包含来自不同表的选择

Select SCDATA.SCCLNT.CCLNT, 
    (Select SCDATA.SCCLNT.CNAME From SCDATA.SCCLNT 
    Where SCDATA.SCCLNT.CLTGRP Like '231043' Fetch First 
    1 Rows Only) As ClientName, 
    CONCAT(TRIM(SCDATA.SCCLNT.CADD1), SCDATA.SCCLNT.CADD2) As Address1, 
    CONCAT(TRIM(SCDATA.SCCLNT.CCITY), CONCAT(', ', 
    CONCAT(TRIM(SCDATA.SCCLNT.CSTATE), CONCAT(' ',    
TRIM(SCDATA.SCCLNT.CZIP))))) 
    As Address2, 
    SCDATA.SCCLNT.CLTGRP As Group, 
    CONCAT((Select  
VARCHAR_FORMAT(Min(TIMESTAMP_FORMAT(Cast(SCDATA.SCACCT.GPLDAT 
    As Char(10)), 'YYYYMMDD')), 'MM/DD/YYYY') From SCDATA.SCACCT 
    Where SCDATA.SCACCT.GPLDAT Between 20170401 and 20170501), CONCAT(' -  ', 
    (Select VARCHAR_FORMAT(Max(TIMESTAMP_FORMAT(Cast(SCDATA.SCACCT.GPLDAT  As 
    Char(10)), 'YYYYMMDD')), 'MM/DD/YYYY') From SCDATA.SCACCT 
    Where SCDATA.SCACCT.GPLDAT Between 20170401 and 20170501))) As  dateRange, 
    SCDATA.SCACCT.GCLNT, 
    SCDATA.SCACCT.GPLACE, 
    SCDATA.SCACCT.GPLDAT, 
    SCDATA.SCACCT.GACCT# As GACCTnum, 
    CONCAT(TRIM(SCDATA.SCACCT.GLAST), CONCAT(', ',  TRIM(SCDATA.SCACCT.GFIRST))) As 
    Debtor, 
    (SCDATA.SCACCT.GPRI + SCDATA.SCACCT.GINT) as Balance, 
    SCDATA.SCACCT.Gdebt#, 
CASE 
    WHEN GDC20 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC20  FETCH TOP 1 ROWS) 
    WHEN GDC19 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC19 FETCH TOP 1 ROWS) 
    WHEN GDC18 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC18 FETCH TOP 1 ROWS) 
    WHEN GDC17 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC17  FETCH TOP 1 ROWS) 
    WHEN GDC16 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC16 FETCH TOP 1 ROWS) 
    WHEN GDC15 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC15 FETCH TOP 1 ROWS) 
    WHEN GDC14 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC14 FETCH TOP 1 ROWS) 
    WHEN GDC13 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC13 FETCH TOP 1 ROWS) 
    WHEN GDC12 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC12 FETCH TOP 1 ROWS) 
    WHEN GDC11 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC11 FETCH TOP 1 ROWS) 
    WHEN GDC10 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC10 FETCH TOP 1 ROWS) 
    WHEN GDC09 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC09 FETCH TOP 1 ROWS) 
    WHEN GDC08 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC08 FETCH TOP 1 ROWS) 
    WHEN GDC07 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC07 FETCH TOP 1 ROWS) 
    WHEN GDC06 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC06 FETCH TOP 1 ROWS) 
    WHEN GDC05 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC05 FETCH TOP 1 ROWS) 
    WHEN GDC04 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC04 FETCH TOP 1 ROWS) 
    WHEN GDC03 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC03 FETCH TOP 1 ROWS) 
    WHEN GDC02 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC02 FETCH TOP 1 ROWS) 
    WHEN GDC01 !='' THEN (Select SDDESC from SC0016 where SDCODE=GDC01 FETCH TOP 1 ROWS) 
    ELSE 'xx' 
END as Description 


From SCDATA.SCCLNT 
    inner Join SCDATA.SCACCT On SCDATA.SCACCT.GCLNT = SCDATA.SCCLNT.CCLNT  And 
    SCDATA.SCACCT.GPLDAT Between 20170401 and 20170501 
Where SCDATA.SCCLNT.CLTGRP Like '231043' 
Group By SCDATA.SCCLNT.CCLNT, 
    SCDATA.SCCLNT.CLTGRP, 
    SCDATA.SCCLNT.CNAME, 
    SCDATA.SCCLNT.CADD1, 
    SCDATA.SCCLNT.CADD2, 
    SCDATA.SCCLNT.CCITY, 
    SCDATA.SCCLNT.CSTATE, 
    SCDATA.SCCLNT.CZIP, 
    SCDATA.SCACCT.GFIRST, 
    SCDATA.SCACCT.GLAST, 
    SCDATA.SCACCT.GCLNT, 
    SCDATA.SCACCT.GPLACE, 
    SCDATA.SCACCT.GPLDAT, 
    SCDATA.SCACCT.GACCT#, 
SCDATA.SCACCT.gpri, 
SCDATA.SCACCT.GINT, 
SCDATA.SCACCT.GDEBT#, 
GDC20, 
GDC19, 
GDC18, 
GDC17, 
GDC16, 
GDC15, 
GDC14, 
GDC13, 
GDC12, 
GDC11, 
GDC10, 
GDC09, 
GDC08, 
GDC07, 
GDC06, 
GDC05, 
GDC04, 
GDC03, 
GDC02, 
GDC01 

此查询背后的目的是为了获得在查询结果中显示排名最高的描述代码,但该程序是内置,这样的说明会陆续加入,所以我需要倒计时从20到1找到最近使用的代码。这些代码是一个简单的2字符组合,对应于另一个需要提取信息的表。

问题是如何重新设计DB2中的case语句以将我需要的单个值从SC0016表中提取出来?

感谢

回答

0

的解决方案,事实证明,是把在连接语句中的选择情况。所以在选择部分我会列出我想要的领域,SDDESC,并在加入我 LEFT JOIN SC0016上SDCODE = 情况下,当GDC20!=“”然后GDC20 ......结束

这将使我基于第一个表中最高的填充列来连接每一行。不是很规范化,但我没有写入数据库:)这工作。