Re: MSSQL - Transpose
Geizhals » Forum » Programmierung » MSSQL - Transpose (33 Beiträge, 451 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
MSSQL - Transpose
20.01.2011, 21:36:54
Hallo

Ich melde mich mal wieder mit einem Problem an dem ich derzeit scheitere. Ich habe folgende Datenstruktur:

Table: ARTIKEL
ARTIKEL     NAME
100-1001    Produkt1
100-1002    Produkt2

Table: ARTIKELLIEFERANT
ARTIKEL      LIEFERANTNAME       LIEFERANTBESTNR
100-1001     DiTech              0815
100-1001     E-Tec               4711
100-1001     Amazon              1112
100-1002     Teufel              A012
100-1002     Hofer               8273


Was ich nun gerne hätte ist folgendes:

ARTIKEL   NAME        LIEF1   LIEFNR1    LIEF2  LIEFNR2    LIEF3  LIEFNR3
100-1001  Produkt1    DiTech  0815       E-Tec  4711       Amazon 1112
100-1002  Produkt2    Teufel  A012       Hofer  8273       NULL   NULL


Dabei kommen maximal 3 Zeilen zu einem "Artikel" vor, sollten es mehr sein -> irrelevant.

Irgendwie komme ich bei der Fragestellung nicht ganz auf einen grünen Zweig. Versucht hätte ich es mittels PIVOT aber entweder es geht damit nicht oder ich habe mit zu dumm angestellt.

Achja, ich würde das ganze für viele Artikel in einer View benötigen, d.h. ich weiss nicht ob eine Lösung evtl. mittels Cursor hier sinnvoll wäre?

SQL Server wäre ein 2005er wenn das relevant ist :)

Danke mal im Voraus an die Spezialisten hier :)

Wenn der Sturm losbricht,
verstummen die Einen vor Schrecken,
und die Anderen breiten, einem Adler gleich, die Flügel aus
und schwingen sich empor.

Herzlichen Dank an Raydoo für die Fotos

Antworten PM Alle Chronologisch
 
Melden nicht möglich
.  Re: MSSQL - Transpose  (kiff-kiff am 21.01.2011, 07:36:47)
.  Re: MSSQL - Transpose  (zeddicus am 21.01.2011, 10:24:14)
..  Re(2): MSSQL - Transpose  (Somnatic am 21.01.2011, 10:33:19)
...  Re(3): MSSQL - Transpose  (zeddicus am 21.01.2011, 12:08:05)
....  Re(4): MSSQL - Transpose  (Somnatic am 21.01.2011, 22:54:52)
....  Re(4): MSSQL - Transpose  (Somnatic am 23.01.2011, 09:20:13)
.  Re: MSSQL - Transpose  (King_Uli am 21.01.2011, 17:05:56)
..  Re(2): MSSQL - Transpose  (Somnatic am 21.01.2011, 22:54:27)
...  Re(3): MSSQL - Transpose  (King_Uli am 22.01.2011, 18:16:35)
. Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (blitzfreak am 23.01.2011, 01:01:37)
.
Re: MSSQL - Transpose
23.01.2011, 01:02:20
direkt mit PIVOT wird das nicht hinhauen.

ich würde das ganze über einen zwischenschritt mittels einer view realisieren die dir so etwas wie eine Zeilen ID bezogen auf die Artikelnummer generiert. Das geht am einfachsten über RANK() OVER.

Konkret für dein Beispiel:

1. Schritt die View die dir das "ranking" erstellt:


SELECT     t0.artikel, t0.name, t1.lieferantname, t1.lieferantbestnr, rank() OVER (Partition BY T0.artikel ORDER BY t1.lieferantbestnr) AS liefid
FROM         dbo.[@artikel] AS t0 LEFT OUTER JOIN
                      dbo.[@artikellieferant] AS t1 ON t0.artikel = t1.artikel


ich habe diese als dbo.v_liefid abgespeichert. Das SQL Server Management Studio wird dir beim Ausführen direkt in der View einen Fehler ausgeben - funktioniert aber trotzdem ;)

Nun haben wir pro Artikel eine LieferantenID mit der wir weiterarbeiten können.

2. Schritt wäre nun deine gewünschte View damit das oben gewünschte Ergebnis ausgeben wird:


select t0.artikel, t0.name, t1.lieferantname, t1.lieferantbestnr, t2.lieferantname, t2.lieferantbestnr, t3.lieferantname, t3.lieferantbestnr
from dbo.[@artikel] as t0
left join dbo.v_liefid t1 on t0.artikel = t1.artikel and t1.liefid = 1
left join dbo.v_liefid t2 on t0.artikel = t2.artikel and t2.liefid = 2
left join dbo.v_liefid t3 on t0.artikel = t3.artikel and t3.liefid = 3


die Spalten musst halt dann noch mit AS so benennen wie du es gerne hättest. Diese Kosmetikaufgabe überlasse ich dir.



-----------------------------------
x-x-o
o-x-o
o-o-x ... and the winner is x
23.01.2011, 01:45 Uhr - Editiert von blitzfreak, alte Version: hier
Antworten PM Alle Chronologisch Zum Vorgänger
 
Melden nicht möglich
..  Re(2): MSSQL - Transpose  (Somnatic am 23.01.2011, 09:21:27)
...  Re(3): MSSQL - Transpose  (blitzfreak am 23.01.2011, 15:56:05)
....  Re(4): MSSQL - Transpose  (Somnatic am 23.01.2011, 20:06:15)
.....  Re(5): MSSQL - Transpose  (blitzfreak am 23.01.2011, 20:43:53)
......  Re(6): MSSQL - Transpose  (Somnatic am 23.01.2011, 22:34:16)
..  Re(2): MSSQL - Transpose  (Somnatic am 23.01.2011, 20:18:02)
...  Re(3): MSSQL - Transpose  (blitzfreak am 23.01.2011, 20:40:29)
.  Re: MSSQL - Transpose  (kiff-kiff am 23.01.2011, 08:44:54)
..  Re(2): MSSQL - Transpose  (Somnatic am 23.01.2011, 09:20:04)
...  Re(3): MSSQL - Transpose  (King_Uli am 23.01.2011, 11:50:30)
....  Re(4): MSSQL - Transpose  (kiff-kiff am 23.01.2011, 12:51:06)
.....  Re(5): MSSQL - Transpose  (blitzfreak am 23.01.2011, 15:53:23)
......  Re(6): MSSQL - Transpose  (zeddicus am 23.01.2011, 20:52:19)
.......  Re(7): MSSQL - Transpose  (blitzfreak am 23.01.2011, 20:53:40)
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung