2017-05-31 3 views
0

DB2サーバーではかなり大きな照会を実行しています。このクエリでは、20のオプションを持つcase文があります。このケースは、各when節にサブクエリを配置しようとするまで完全に機能します。それから、私にエラーが発生し、どこで発生するのかわからない。DB2選択事例で別の表のselectを含めるには

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文字の組み合わせです。

質問は、私がSC0016テーブルから必要とする単一の値を引き出すために、DB2のcase文をどのように再設計できますか?

おかげ

答えて

0

ソリューションは、結局のところ、結合文のselectケースを置くことでした。私は私が欲しかったフィールドをリストし、選択部分、SDDESCで、かつ参加私は LEFT SDCODEにSC0016を登録しよう= CASE GDC20!=「」その後、GDC20 ...最後にそう

これは私ができるようになります最初のテーブルの上位に配置された列に基づいて各行を結合します。あまり正規化されていないが、私はデータベースを書いていない:)これは動作します。