doppelte Einträge / Window Function

Mr. Robot

Fleissiger Benutzer
Beiträge
88
Hallo zusammen,

ich habe folgendes Problem:

Abbildung:

ANZAHL_TAGE.PNG


Tabelle 1 ist erstmal so wie ich es möchte. Wenn PREISE = 0 dann sollen auch auch die ANZAHL_TAGE = 0 sein wie in ANZAHL_TAGE_KORR umgesetzt. Wenn die Preise negativ sind, dann sollen die ANZAHL_TAGE auch negativ sein. Bei einer Summierung der Spalte ANZAHL_TAGE_KORR würden sich dann die Tage aufheben, wie die Preise. Das lässt sich mit einer einfachen CASE WHEN ABFRAGE umsetzen.

Problem:
Wie in Tabelle 2 zu sehen gibt es aber auch Fälle mit Preisen ungleich 0 und doppelten ANZAHL TAGE Einträgen (siehe Tabelle 2, Zeile 2 und 3). Hier möchte ich die Tage nur einmal berücksichtigten... also einer von den beiden 159 muss weg.

Habe es schon mit der Window Function und ROW_NUMBER() versucht und wollte immer den ersten Eintrag nehmen... dann haut man auch die negativen Fälle aus Tabelle 1 weg.

Wie lässt sich dieses Problem lösen?

Danke im Voraus.
 
Werbung:
Hi,

so wie ich es verstanden habe, möchtest du die Werte "Preise" und "Anzahl_Tage" je PNR aggregieren.
Dabei sollen negative "Preise" auch zu einer Reduzierung der Tage führen?

Wenn das richtig ist, bist du mit der Fensterfunktion nicht ganz verkehrt unterwegs, du musst nur richtig Partitionieren.

Ich habe versucht aus den wenigen Daten die du mitgegeben hast ein Schema zu entdecken und habe dann folgendes versucht:

Code:
IF OBJECT_ID('TempDB..#tbl') IS NOT NULL DROP TABLE #tbl;
CREATE TABLE #tbl
(
    PNR int,
    Preise money,
    Tage int
)


INSERT INTO #tbl
(
   PNR,Preise, Tage
)
VALUES
(1    ,0    ,337),
(1    ,8286    ,337),
(2    ,-8975    ,365),
(2    ,0    ,365),
(2    ,0    ,365),
(2,    8975    ,365),
(3    ,0    ,28),
(3,    688    ,28),
(4,0    ,159),
(4,    1696,    159),
(4    ,2213,    159),
(5,    0,69),
(6,    0,206),
(6,    5065,    206)

;WITH cte_s
AS
(
SELECT
PNR    = PNR,
Preise    = (Preise),
KorrTage = (CASE WHEN ROW_NUMBER() OVER (PARTITION BY PNR, SIGN(Preise) ORDER BY Tage) >1 THEN 0 
                   ELSE CONVERT(int, Tage*SIGN(Preise)) END)

FROM #tbl
)

SELECT
PNR,
Preise = SUM(Preise),
Tage = SUM(KorrTage)
FROM cte_s
GROUP BY PNR

Die Aggregation liefert dann folgendes Ergebnis:
|*PNR*|*Preise*|*Tage*|
|1|8286,00|337|
|2|0,00|0|
|3|688,00|28|
|4|3909,00|159|
|5|0,00|0|
|6|5065,00|206|

Viele Grüße,
Tommi
 
Also wenn das über die AnzahlTage laufen soll, halte ich das für sehr riskant.
Die Antwort von @Tommi deutet ja auf die PNR hin als wirkliches Aggregat Merkmal. Die Tage als Merkmal können sich auch zufällig irgendwoher auf die gleichen Werte aggregieren.
Apropos: Wenn die AnzahlTage da so rumliegt, wäre die Frage, wo sie herkommt? Ist das schon das Ergebnis einer Abfrage? Und ist das vielleicht schon falsch?
Und zu
und doppelten ANZAHL TAGE
Du meinst die Werte kommen 2x identisch vor? Nicht, es gibt einen Wert, der mit 2 multipliziert wieder auftaucht?
 
Werbung:
Moin Tommi,

super, funktioniert soweit ganz gut. Aggregiere über 5 Spalten bei 2 Mio. Datensätzen... hoffe daher, dass es für alle Fälle richtig läuft :)

Viele Grüße
Mr. Robot
 
Zurück
Oben