Ausgabe
Ich habe eine Tabelle im Datenbanknamen [DWSTAGE].INVAUD. Da diese Tabelle zu groß ist, erstelle ich den temporären Tabellennamen ##INV_UD_TRANSACTION_71, der nur den Transaktionstyp 71 filtert.
Mein Ziel war es, Datensätze zu filtern, die 3 aufeinanderfolgende Monate haben, basierend auf inumbr, itrloc.
mein partielles Skript unten
#temp-Tabelle
SELECT INUMBR,ITRLOC,ITRDAT
INTO #INV_UD_TRANSACTION_71
FROM [DWSTAGE].INVAUD
WHERE ITRTYP = '71'
Teilabfrage für 3 aufeinanderfolgende Monate
SELECT DISTINCT * FROM
(SELECT E1.INUMBR
,E1.ITRLOC
,E1.ITRDAT
FROM #INV_UD_TRANSACTION_71 E1
JOIN #INV_UD_TRANSACTION_71 E2
ON E2.INUMBR = E1.INUMBR
AND MONTH(E2.ITRDAT) = MONTH(E1.ITRDAT) + 1
JOIN #INV_UD_TRANSACTION_71 E3
ON E3.INUMBR = E2.INUMBR
AND MONTH(E3.ITRDAT) = MONTH(E2.ITRDAT) + 1
UNION ALL
SELECT E2.INUMBR
,E2.ITRLOC
,E2.ITRDAT
FROM #INV_UD_TRANSACTION_71 E1
JOIN #INV_UD_TRANSACTION_71 E2
ON E2.INUMBR = E1.INUMBR
AND MONTH(E2.ITRDAT) = MONTH(E1.ITRDAT) + 1
JOIN #INV_UD_TRANSACTION_71 E3
ON E3.INUMBR = E2.INUMBR
AND MONTH(E3.ITRDAT) = MONTH(E2.ITRDAT) + 1
UNION ALL
SELECT E3.INUMBR
,E3.ITRLOC
,E3.ITRDAT
FROM #INV_UD_TRANSACTION_71 E1
JOIN #INV_UD_TRANSACTION_71 E2
ON E2.INUMBR = E1.INUMBR
AND MONTH(E2.ITRDAT) = MONTH(E1.ITRDAT) + 1
JOIN #INV_UD_TRANSACTION_71 E3
ON E3.INUMBR = E2.INUMBR
AND MONTH(E3.ITRDAT) = MONTH(E2.ITRDAT) + 1
) A
ORDER BY INUMBR,ITRLOC
Und Abfrageergebnis war
INUMBR ITRLOC ITRDAT
40 13001 210823
40 14002 211115
40 15008 210419
40 15010 210416
40 15012 211115
43 11004 210129
43 12004 210909
43 12004 181018
43 12004 210129
43 12004 210701
43 12004 220404
43 13003 220117
43 13003 210329
43 14001 210301
43 14006 220214
43 14006 210617
43 14006 201009
43 14006 210909
43 14006 220110
43 14006 220505
......................
Mein erwartetes Ergebnisbeispiel
INUMBR ITRLOC ITRDAT
92 12002 210105
92 12002 210210
92 12002 210311
92 12003 210405
107 12009 190104
107 12009 190210
107 12009 190329
1187 13001 220506
1187 13001 220611
1187 13001 220713
1187 13001 220817
1187 13001 220920
Lösung
Sie können dies mit dem Datum handhaben, anstatt das Integer-Format zu haben.
Konvertieren Sie zunächst das
ITRDAT
Datumsformat mit der folgenden Syntax
select convert (date, Stuff(Stuff('210823',5,0,'.'),3,0,'.'), 4)
Tabellenerstellung:
CREATE TABLE #INV_UD_TRANSACTION_71(INUMBR int,ITRLOC int,ITRDAT varchar(20))
GO
insert into #INV_UD_TRANSACTION_71
select 40 ,13001,'210823' union
select 40 ,13001,'150923' union
select 40 ,13001,'200723' union
select 41 ,13002,'210617' union
select 41 ,13002,'151017' union
select 41 ,13002,'110417'
Versuchen Sie die folgende Abfrage, um die Daten zwischen aufeinanderfolgenden Monaten zu vergleichen.
SELECT *
FROM(
SELECT E1.INUMBR
,E1.ITRLOC
,E1.ITRDAT
FROM #INV_UD_TRANSACTION_71 E1
JOIN #INV_UD_TRANSACTION_71 E2
ON E2.INUMBR = E1.INUMBR
AND E2.ITRLOC = E1.ITRLOC
JOIN #INV_UD_TRANSACTION_71 E3
ON E3.INUMBR = E1.INUMBR
AND E3.ITRLOC = E1.ITRLOC
AND DATEADD(DAY,1, EOMONTH(convert (date, Stuff(Stuff(e1.ITRDAT,5,0,'.'),3,0,'.'), 4),-1)) = DATEADD(DAY,1, EOMONTH(convert (date, Stuff(Stuff(e2.ITRDAT,5,0,'.'),3,0,'.'), 4),0))
AND DATEADD(DAY,1, EOMONTH(convert (date, Stuff(Stuff(e1.ITRDAT,5,0,'.'),3,0,'.'), 4),-1)) = DATEADD(DAY,1, EOMONTH(convert (date, Stuff(Stuff(e3.ITRDAT,5,0,'.'),3,0,'.'), 4),1))
) A
Wie funktioniert es
Abfrage 1: konvertiert jeden ITRDAT in das Datum des Monatsbeginns
DATEADD(DAY,1, EOMONTH(convert (date, Stuff(Stuff(e1.ITRDAT,5,0,'.'),3,0,'.'), 4),-1))
Abfrage 2: Wandelt das vorherige Monatsdatum in das Startdatum des aktuellen Monats um
DATEADD(DAY,1, EOMONTH(convert (date, Stuff(Stuff(e2.ITRDAT,5,0,'.'),3,0,'.'), 4),0))
Abfrage 3: Konvertiert das Datum des nächsten Monats in das Startdatum des aktuellen Monats
DATEADD(DAY,1, EOMONTH(convert (date, Stuff(Stuff(e3.ITRDAT,5,0,'.'),3,0,'.'), 4),1))
Sobald das Datum des vorherigen Monats und des nächsten Monats in das erste Datum des aktuellen Monats konvertiert wurde, mache ich einen gleichen Vergleich für die Daten.
Beantwortet von – Roshan
Antwort geprüft von – Timothy Miller (FixError Admin)