2016-06-30 5 views
2

Ich habe eine Abfrage, die Zeilen mit einem bestimmten Schlüssel auf eine ID abbildet.Mehrere Vorkommen von Wert bedingt verarbeiten

Die Abfrage sieht wie folgt aus:

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 

Ausführung die folgenden Zeilen zurückgibt:

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 

Sie sehen, dass die importdate (2016.05.30) zweimal auftritt. Ich möchte, dass, wenn das gleiche Datum zweimal auftritt, es nur die Zeile zurückgeben soll, in der "Gruppe" gleich "G" ist.

Jemand weiß, wie man das macht? Ich habe fast alles ausprobiert, aber ich merke, dass mir einige Syntaxkenntnisse von SQL fehlen.

Vielen Dank im Voraus

EDIT:

Das Ergebnis, das ich hier sehen will, ist:

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 

Antwort

0

Es ist eine Variation einer top-n-per-group Abfrage.

Hier ist eine Möglichkeit, es mit ROW_NUMBER() zu tun. Diese Funktion weist für jede Zeile eine Nummer zu. Seine PARTITION BY Importdate Klausel wird die Zeilennummern von 1 für jedes Datum neu starten. Seine ORDER BY Klausel würde Zeile mit [Group] = 'G' an der Spitze der Partition setzen und diese Zeilen hätten rn = 1.

Wenn Sie zwei oder mehr Zeilen mit den gleichen Importdate und [Group] = 'G' haben, wird nicht definiert, welche Zeile ausgewählt wird. Sie können der ORDER BY-Klausel weitere Spalten hinzufügen (z. B. ID), um festzulegen, welche Zeile ausgewählt werden soll.

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

Vielen Dank! Das funktioniert sehr gut. – nitsuj1001

Verwandte Themen