none
Problem mit SQL Abfrage RRS feed

  • 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      3

    Also 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

    Montag, 2. August 2010 14:16

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
    Dienstag, 3. August 2010 13:45

Alle Antworten

  • Ich denke, daß ist einer dser Fälle, wo man auf einen Cursor zurückgreifen muß.

    Alles andere scheint nicht zu funktionieren.

    Dienstag, 3. August 2010 11:59
  • 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
    Dienstag, 3. August 2010 13:45