Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Ergebnisse in Spalten statt in Zeilen ausgeben...

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Dhakiyah, 18 November 2014.

  1. Dhakiyah

    Dhakiyah Benutzer

    Hallo!
    Ich habe folgendes Problem.
    Ich habe einen Artikel mit verschiedenen Bemerkungen.
    Wenn ich jetzt folgendes mache:
    Select a.Artikelnr, a.Artikelbeschreibung, B.Artikelbemerkung from Artikel a, Bemerkung b
    where a.Artikelnr = B.Artikelnr​
    kommen die Ergebniss ja wie folgt:
    1 Hase rosa
    1 Hase 20cm
    1 Hase plüsch
    2 Küken blau
    2 Küken 10cm
    2 Küken plüsch

    Ich möchte es aber so haben:
    1 Hase rosa 20cm plüsch
    2 Küken blau 10cm plüsch

    Versteht ihr was ich meine?
    Geht das über SQL?
     
  2. ukulele

    ukulele Datenbank-Guru

    Das geht auf verschiedenen Wegen unterschiedlich komplex. Haben alle Artiel die ausgegeben werden sollen die selbe Anzahl an Bemerkungen und über wieviele Bemerkungen (pro Artikel) sprechen wir hier?
     
  3. Dhakiyah

    Dhakiyah Benutzer

    Es können beliebig viele Bemerkungen sein, angezeigt werden sollten max. 5.

    In oben genannten Beispiel:
    Nr Beschreibung Bemerkung1 Bemerkung2 Bemerkung3

    Ich habe da mals mit dem RowNumber() over rumgespielt, kam aber auch hier nicht zu einem Ergebnis.

    Bei Oracle kann man glaube ich das so machen:
    Select * from (select...), (select...)
     
  4. ukulele

    ukulele Datenbank-Guru

    Mit ROW_NUMBER() geht das schon ganz gut, vor allem wenn man es mit unterschiedlichen Bemerkungen zu tun hat und man statisch nur fünf Spalten ausgeben will.
    Code:
    WITH b AS (
    SELECT    ROW_NUMBER() OVER (PARTITION BY Artikelnr ORDER BY Artikelbemerkung) AS zeile,
            Artikelnr,
            Artikelbemerkung
    FROM    Bemerkung
    )
    SELECT    a.Artikelnr,
            a.Artikelbeschreibung,
            b1.Artikelbemerkung,
            b2.Artikelbemerkung,
            b3.Artikelbemerkung,
            b4.Artikelbemerkung,
            b5.Artikelbemerkung
    FROM    Artikel a
    LEFT JOIN b b1
    ON        a.Artikelnr = b1.Artikelnr
    AND        b1.zeile = 1
    LEFT JOIN b b2
    ON        a.Artikelnr = b2.Artikelnr
    AND        b2.zeile = 2
    LEFT JOIN b b3
    ON        a.Artikelnr = b3.Artikelnr
    AND        b3.zeile = 3
    LEFT JOIN b b4
    ON        a.Artikelnr = b4.Artikelnr
    AND        b4.zeile = 4
    LEFT JOIN b b5
    ON        a.Artikelnr = b5.Artikelnr
    AND        b5.zeile = 5
    Alternativ könnte man mit PIVOT statt mit LEFT JOIN arbeiten, finde ich aber immer etwas fummelig.
     
  5. Dhakiyah

    Dhakiyah Benutzer

    Super, hat funktioniert.

    Eine Frage hätte ich da jetzt noch.
    Kann ich zwei von diesen Row_Number() miteinander verbinden?

    Also praktisch:
    With b as (....)
    With c as (....)
    Select a, b, c from Artikel
    .
    .
    .
    .
    .
     
  6. ukulele

    ukulele Datenbank-Guru

    Du kannst mit WITH a AS (...), b AS (...) mehrere CTE-Tabellen bereitstellen. Das mit dem Verbinden würde ich aber eher im anschließenden Select machen, wobei ich mir nicht sicher bin wie du sie genau verbinden möchtest, z.B. so:
    Code:
    WITH b AS (
    SELECT    ROW_NUMBER() OVER (PARTITION BY Artikelnr ORDER BY Artikelbemerkung) AS zeile,
            Artikelnr,
            Artikelbemerkung
    FROM    Bemerkung
    )
    SELECT    a.Artikelnr,
            a.Artikelbeschreibung,
            (    CASE
                WHEN    b1.Artikelbemerkung IS NOT NULL
                THEN    b1.Artikelbemerkung
                ELSE    ''
                END ) +
            (    CASE
                WHEN    b2.Artikelbemerkung IS NOT NULL
                THEN    '; ' + b2.Artikelbemerkung
                ELSE    ''
                END ) +
            (    CASE
                WHEN    b3.Artikelbemerkung IS NOT NULL
                THEN    '; ' + b3.Artikelbemerkung
                ELSE    ''
                END ) +
            (    CASE
                WHEN    b4.Artikelbemerkung IS NOT NULL
                THEN    '; ' + b4.Artikelbemerkung
                ELSE    ''
                END ) +
            (    CASE
                WHEN    b5.Artikelbemerkung IS NOT NULL
                THEN    '; ' + b5.Artikelbemerkung
                ELSE    ''
                END ) AS Artikelbemerkung
    FROM    Artikel a
    LEFT JOIN b b1
    ON        a.Artikelnr = b1.Artikelnr
    AND        b1.zeile = 1
    LEFT JOIN b b2
    ON        a.Artikelnr = b2.Artikelnr
    AND        b2.zeile = 2
    LEFT JOIN b b3
    ON        a.Artikelnr = b3.Artikelnr
    AND        b3.zeile = 3
    LEFT JOIN b b4
    ON        a.Artikelnr = b4.Artikelnr
    AND        b4.zeile = 4
    LEFT JOIN b b5
    ON        a.Artikelnr = b5.Artikelnr
    AND        b5.zeile = 5
     
  7. Dhakiyah

    Dhakiyah Benutzer

    Ich habe zusätzlich noch pro Artikel verschiedene Filialen.
    Im Ergebnis sollte es dann so aussehen:

    Nr Beschreibung Bemerkung1 Bemerkung2 Bemerkung3 Filiale1 Filiale2 Filiale3

    Ich habe jetzt versucht einmal das ganze mit den Filialen zu machen, das hat auch funktioniert.
    Wenn ich jetzt aber
    With c as (...)
    ,
    With b as (...)
    Select ...
    from ...
    Left Join...

    Kommt ein Fehler:
    Falsche Syntax in der Nähe des With-Schlüsselwortes...


    Folgendes geht auch nicht:

    Select * from
    (with...) x,
    (with...) y

    Where x.Nr = y.Nr

    Auch hier kommt der Fehler mit der Falschen Syntax in der Nähe des With-Schlüsselwortes...
     
    Zuletzt bearbeitet: 18 November 2014
  8. Distrilec

    Distrilec Datenbank-Guru

    Code:
    With c as (...)
    ,
    With b as (...)
    Select ...
    from ...
    Left Join...
    das sollte so aussehen:
    Code:
    With c as (...),
    b as (...)
    Select ...
    from ...
    Left Join...
     
  9. ukulele

    ukulele Datenbank-Guru

    Nichts anderes habe ich behauptet :)
     
  10. Dhakiyah

    Dhakiyah Benutzer

    PERFEKT!

    Vielen Dank! :)
     
  11. Distrilec

    Distrilec Datenbank-Guru

    @ukulele : Ich wollte @Dhakiyah nur darauf hinweisen dass sie ein With zu viel hat :)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden