【SQL Server】枝番の最大値データを取得するサンプルSQL(結合あり)

eda-sql-sumne
スポンサーリンク

どうも、あおです。

 

 

今回は、結合して取得したデータの内、キー項目ごとの

枝番の最大値のデータを取得することをメインとしたSQLです。

 

まずWITHを使ったSELECTで枝番の最大値を取得しておいて、

それだけだと項目が足りないので、内部結合して項目を追加で取得、

それをメインのSELECTと外部結合して、WHERE条件で

必要なレコードを取り出すといった流れです。

 

 

例として、実際のテーブルと抽出結果で説明します。

 

左が見積テーブル(MTR)、右が仕入テーブル(SIR)

eda-sql-2

 

 

見積テーブル(MTR)はMTNOがキー項目、

仕入テーブル(SIR)は、SIIRENO、SIIRENOEDAの2項目がキー項目。

 

結合項目は見積NO(MTNO)

見積テーブルに仕入テーブルを外部結合して、

仕入テーブルの各データも取得する。

その際、同じ仕入番号(SIIRENO)で枝番(SIIRENOEDA)が

異なるデータがある場合には、最大の枝番を取得します。

最大でない枝番のレコードは取得しないようにします。

 

 

 

取得結果イメージ

eda-sql-sumne

 

 

ここでポイントなのが、

見積番号(MTNO)に紐づく仕入番号(SIIRENO)は、

NULLのケースもあるということ。

これも取得したいので、WHEREでCASE指定して取得します。

 

仕入番号(SIIRENO)がNULLのデータを取得する用に、

LEFT JOINで仕入テーブル(SIR)も紐づけます。

 

 

 

 

取得SQLがこちら

eda-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

 

 

PC
スポンサーリンク