どうも、あおです。
今回は、結合して取得したデータの内、キー項目ごとの
枝番の最大値のデータを取得することをメインとしたSQLです。
まずWITHを使ったSELECTで枝番の最大値を取得しておいて、
それだけだと項目が足りないので、内部結合して項目を追加で取得、
それをメインのSELECTと外部結合して、WHERE条件で
必要なレコードを取り出すといった流れです。
例として、実際のテーブルと抽出結果で説明します。
左が見積テーブル(MTR)、右が仕入テーブル(SIR)
見積テーブル(MTR)はMTNOがキー項目、
仕入テーブル(SIR)は、SIIRENO、SIIRENOEDAの2項目がキー項目。
結合項目は見積NO(MTNO)
見積テーブルに仕入テーブルを外部結合して、
仕入テーブルの各データも取得する。
その際、同じ仕入番号(SIIRENO)で枝番(SIIRENOEDA)が
異なるデータがある場合には、最大の枝番を取得します。
最大でない枝番のレコードは取得しないようにします。
取得結果イメージ
ここでポイントなのが、
見積番号(MTNO)に紐づく仕入番号(SIIRENO)は、
NULLのケースもあるということ。
これも取得したいので、WHEREでCASE指定して取得します。
仕入番号(SIIRENO)がNULLのデータを取得する用に、
LEFT JOINで仕入テーブル(SIR)も紐づけます。
取得SQLがこちら
コピペ用
WITH work1 AS( SELECT SIIRENO ,MAX(SIIRENOEDA) AS SIIRENOEDA FROM SIR GROUP BY SIIRENO ) ,work2 AS( SELECT SIIRENO ,SIIRENOEDA ,MTNO ,KINGAKU ,JYOKYO ,BIKOU FROM SIR ) ,work3 AS( SELECT W2.SIIRENO ,W2.SIIRENOEDA ,W2.MTNO ,W2.KINGAKU ,W2.JYOKYO ,BIKOU FROM work1 AS W1 INNER JOIN work2 AS W2 ON W1.SIIRENO = W2.SIIRENO AND W1.SIIRENOEDA = W2.SIIRENOEDA ) SELECT MTR.MTNO ,W3.SIIRENO ,W3.SIIRENOEDA ,MTR.KINGAKU AS MtrKINGAKU ,MTR.JYOKYO AS MtrJYOKYO ,MTR.BIKOU AS MtrBIKOU ,W3.KINGAKU AS SirKINGAKU ,W3.JYOKYO AS SirJYOKYO ,W3.BIKOU AS SirBIKOU FROM MTR LEFT JOIN work3 AS W3 ON MTR.MTNO = W3.MTNO LEFT JOIN SIR ON MTR.MTNO = SIR.MTNO WHERE MTR.MTNO = CASE WHEN SIR.SIIRENO IS NOT NULL THEN CASE WHEN W3.SIIRENO IS NOT NULL THEN W3.MTNO ELSE '' END ELSE '' END OR SIR.SIIRENO IS NULL