[FIXED] Wie kann ich Datensätze mit 3 aufeinanderfolgenden Monaten basierend auf zwei Spalten filtern?

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 ITRDATDatumsformat 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like