Ergebnisse in Spalten statt in Zeilen ausgeben...

Dhakiyah

Benutzer
Beiträge
5
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?
 
Werbung:
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?
 
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...)
 
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.
 
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
.
.
.
.
.
 
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
 
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:
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...
 
Werbung:
Zurück
Oben