2016-06-30 4 views
2

特定のキーを持つ行をIDにマッピングするクエリがあります。条件付きで値の複数の出現を処理する

クエリは次のようになります。

SELECT 
    ID, Note, Importdate, Group 
FROM 
    SAP_OPListen2015 
INNER JOIN 
    (SELECT 
     Rechnnr, K, Aufttext, Betrag 
    FROM 
     SAP_OPListen2015 
    WHERE 
      ID = 75790) AS sq_Temp ON SAP_OPListen2015.Rechnnr = sq_Temp.Rechnnr 
           AND SAP_OPListen2015.K = sq_Temp.K 
           AND SAP_OPListen2015.Aufttext = sq_Temp.Aufttext 
           AND sq_Temp.Betrag = SAP_OPListen2015.Betrag 
ORDER BY 
    Importdate 

実行は、次の行を返すされています

ID  NOTE IMPORTDATE    GROUP 
---------------------------------------------- 
75790 NULL 2016-05-30 00:00:00.000 NULL 
76357 NULL 2016-05-30 00:00:00.000 G 
74186 NULL 2016-04-30 00:00:00.000 E 
72688 NULL 2016-03-30 00:00:00.000 NULL 
71019 NULL 2015-11-30 00:00:00.000 NULL 
69481 NULL 2015-10-31 00:00:00.000 NULL 
68173 NULL 2015-09-30 00:00:00.000 NULL 
67142 NULL 2015-05-31 00:00:00.000 NULL 

あなたはimportdate(2016年5月30日)が二回発生していることがわかります。同じ日付が2回発生している場合は、「Group」が「G」に等しい行だけを返す必要があります。

誰かがこれを行う方法を知っていますか?ほぼすべてを試しましたが、SQLの構文知識が不足しています。

事前に感謝

編集:私はここを参照してくださいしたい

結果は次のとおりです。

ID  NOTE IMPORTDATE    GROUP 
---------------------------------------------- 
76357 NULL 2016-05-30 00:00:00.000 G 
74186 NULL 2016-04-30 00:00:00.000 E 
72688 NULL 2016-03-30 00:00:00.000 NULL 
71019 NULL 2015-11-30 00:00:00.000 NULL 
69481 NULL 2015-10-31 00:00:00.000 NULL 
68173 NULL 2015-09-30 00:00:00.000 NULL 
67142 NULL 2015-05-31 00:00:00.000 NULL 

答えて

0

それはtop-n-per-groupクエリのバリエーションです。

ROW_NUMBER()を使用してこれを行う方法の1つです。この関数は、各行に番号を割り当てます。そのPARTITION BY Importdate句は、日付ごとに行番号を1から再開します。そのORDER BY句は、パーティションの先頭に[Group] = 'G'の行を入れ、これらの行はrn = 1になります。

同じImportdate[Group] = 'G'の2つ以上の行がある場合、どの行を選択するかは定義されていません。 ORDER BY句(たとえばIDなど)に列を追加して、選択する行を定義できます。

WITH 
CTE 
AS 
(
    SELECT 
     ID, Note, Importdate, Group 
     ,ROW_NUMBER() OVER (PARTITION BY Importdate 
      ORDER BY CASE WHEN [Group] = 'G' THEN 0 ELSE 1 END) AS rn 
    FROM 
     SAP_OPListen2015 
     INNER JOIN 
     (
      SELECT 
       Rechnnr, K, Aufttext, Betrag 
      FROM 
       SAP_OPListen2015 
      WHERE 
       ID = 75790 
     ) AS sq_Temp 
      ON SAP_OPListen2015.Rechnnr = sq_Temp.Rechnnr 
      AND SAP_OPListen2015.K = sq_Temp.K 
      AND SAP_OPListen2015.Aufttext = sq_Temp.Aufttext 
      AND sq_Temp.Betrag = SAP_OPListen2015.Betrag 
) 
SELECT 
    ID, Note, Importdate, Group 
FROM CTE 
WHERE rn = 1 
ORDER BY 
    Importdate 
; 
+0

ありがとうございました!これはとてもうまくいっています。 – nitsuj1001

関連する問題