Benutzer mit den meisten Antworten
Problem mit SQL Abfrage

Frage
-
Hallo
Vieleicht kann mir ja jemand bei einer Abfrage helfen.
Am Besten gleich ein Beispiel und was ich erwarte:
Monat Typ Rang
1 A 1
2 A 1
3 B 2
4 B 2
5 B 2
6 A 3Also sortiert nach Monat und jedesmal, wenn sich der Typ ändert, soll der Ran erhöht werden. Rang ist also das berechnete Feld welches vom SQL Server her kommen soll. Mit der RANK-Funktion hat es nicht geklappt, weil ich die Wechsel erkennen möchte.
Geht das mit einer SQL-Abfrage oder muss ich das manuell machen(letzte Zeile merken und wenn neu, hochzählen)?
Gruss Christoph
Antworten
-
Hallo Christoph,
unter der Voraussetzung, das es für Monat immer einen Wert gibt, also fortlaufend sind, geht es mit dem Beispiel unten. Wenn die Voraussetzung nicht erfüllt sein sollte, muss man etwas mehr tricksen, z.B. eine weitere CTE für alle Monate anlegen oder den nächsten Monat raussuchen statt vereinfacht mit +1 zu arbeiten.
Die CTE ermittelt die Änderungen im Typ, das Subselect summiert davon die laufenden Werte:
CREATE TABLE #test
(Monat int, Typ char(1));
INSERT INTO #test VALUES (1, 'A');
INSERT INTO #test VALUES (2, 'A');
INSERT INTO #test VALUES (3, 'B');
INSERT INTO #test VALUES (4, 'B');
INSERT INTO #test VALUES (5, 'B');
INSERT INTO #test VALUES (6, 'A');
GO
;WITH cte (Monat, Typ, Diff)
AS (SELECT MAIN.Monat, MAIN.Typ
,CASE WHEN MAIN.Typ = SUB.Typ
THEN 0
ELSE 1 END AS Diff
FROM #test as MAIN
LEFT JOIN #test AS SUB
ON MAIN.Monat = SUB.Monat + 1
)
SELECT Monat, Typ
,(SELECT SUM(Diff)
FROM cte AS SUB
WHERE SUB.Monat <= cte.Monat) AS YtdSum
FROM cte;
GO
DROP TABLE #test;
Monat Typ YtdSum
----------- ---- -----------
1 A 1
2 A 1
3 B 2
4 B 2
5 B 2
6 A 3
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de- Als Antwort vorgeschlagen Elmar BoyeEditor Dienstag, 3. August 2010 14:04
- Als Antwort markiert Robert BreitenhoferModerator Montag, 9. August 2010 15:52
Alle Antworten
-
Hallo Christoph,
unter der Voraussetzung, das es für Monat immer einen Wert gibt, also fortlaufend sind, geht es mit dem Beispiel unten. Wenn die Voraussetzung nicht erfüllt sein sollte, muss man etwas mehr tricksen, z.B. eine weitere CTE für alle Monate anlegen oder den nächsten Monat raussuchen statt vereinfacht mit +1 zu arbeiten.
Die CTE ermittelt die Änderungen im Typ, das Subselect summiert davon die laufenden Werte:
CREATE TABLE #test
(Monat int, Typ char(1));
INSERT INTO #test VALUES (1, 'A');
INSERT INTO #test VALUES (2, 'A');
INSERT INTO #test VALUES (3, 'B');
INSERT INTO #test VALUES (4, 'B');
INSERT INTO #test VALUES (5, 'B');
INSERT INTO #test VALUES (6, 'A');
GO
;WITH cte (Monat, Typ, Diff)
AS (SELECT MAIN.Monat, MAIN.Typ
,CASE WHEN MAIN.Typ = SUB.Typ
THEN 0
ELSE 1 END AS Diff
FROM #test as MAIN
LEFT JOIN #test AS SUB
ON MAIN.Monat = SUB.Monat + 1
)
SELECT Monat, Typ
,(SELECT SUM(Diff)
FROM cte AS SUB
WHERE SUB.Monat <= cte.Monat) AS YtdSum
FROM cte;
GO
DROP TABLE #test;
Monat Typ YtdSum
----------- ---- -----------
1 A 1
2 A 1
3 B 2
4 B 2
5 B 2
6 A 3
Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de- Als Antwort vorgeschlagen Elmar BoyeEditor Dienstag, 3. August 2010 14:04
- Als Antwort markiert Robert BreitenhoferModerator Montag, 9. August 2010 15:52