wisch
Goto Top

MS SQL - Zeilen zu Spalten

Hallo.

Das Thema ist nicht neu, aber ich habe mit allen gefundenen Lösungen meine Fragestellung nicht umgesetzt bekommen.

Ich habe eine recht einfache Tabelle, die so vorgegeben, also nicht von mir beeinflussbar ist:
ID, Maske    , Logname
1 , einkauf  , mueller
1 , vertrieb , mueller
1 , einkauf  , meier
1 , fertigung, meier
...

Masken sind fast 2000 in der Tabelle, Lognamen vlt. 20, beide Angaben sind inhaltlich also dynamisch.

Die Ausgabe soll sein:

Maske    , mueller, meier, ...
einkauf  , x      , x    , ...
vertrieb , x      , -    , ...
fertigung, -      , x    , ...

Im Grunde also eine Tabellenansicht der Maskenzuordnungen zu den Lognamen.

Kann wer helfen? Danke schonmal im Voraus!

Content-ID: 5588244449

Url: https://administrator.de/contentid/5588244449

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

em-pie
em-pie 23.01.2023 aktualisiert um 22:46:31 Uhr
Goto Top
Moin,

Da wirst du dich mit PIVOT() / UNPIVOT() beschäftigen dürfen…

https://learn.microsoft.com/de-de/sql/t-sql/queries/from-using-pivot-and ...
WiSch
WiSch 23.01.2023 um 22:59:58 Uhr
Goto Top
N'Abend.

Ja, da bin ich gelandet und hab es nicht hinbekommen...
Alle Beispiele sind wesentlich komplexer und greifen meist auf z.B. zwei Tabellen zu.

Eine wohl gute Erklärung dazu habe ich bereits hier gefunden:
https://qastack.com.de/programming/13372276/simple-way-to-transpose-colu ...

Nun muss ich aber gestehen, dass ich auch damit mein - wie ich denke - einfacher strukturiertes Problem nicht habe lösen können...

Deshalb mein Unterstützungsaufruf hier.
SachsenHessi
SachsenHessi 24.01.2023 um 08:10:06 Uhr
Goto Top
Guten Morgen,
Dein Stichwort ist "Transponieren".
Zum Beispiel hier: im-coder.com/einfache-moeglichkeit-zum-transponieren-von-spalten-und-zeilen-in-sql.html
VG
SH
em-pie
Lösung em-pie 24.01.2023 aktualisiert um 09:11:12 Uhr
Goto Top
Moin,

hab es mal mit PIVOT und einem "Trick" erstellt/ adaptiert.
Erstellen einer Testabelle:

CREATE TABLE mytable(
	id int
	, MASKE nvarchar(32)
	, NAME nvarchar(32)
	)

INSERT INTO myTable (id, MASKE, NAME) VALUES
(1, 'einkauf', 'meier')  
, (2, 'verkauf', 'meier')  
, (3, 'produktion', 'meier')  
, (4, 'einkauf', 'mueller')  
, (5, 'verkauf', 'mueller')  
, (6, 'fibu', 'schulze')  
, (7, 'einkauf', 'schmidt')  
, (8, 'materialwirtschaft', 'schmidt')  
, (9, 'einkauf', 'jacke')  
, (10, 'verkauf', 'hose')  
, (11, 'projekte', 'hose')  
, (12, 'einkauf', 'socke')  
, (13, 'verkauf', 'jacke')  

Darstellung der Tabelle mit einer dynamischen PIVOT-Funktion:
//Definieren von Variablen
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

//Hier werden alle möglichen NAMEN ermittelt
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(myTable.[NAME])   
            FROM myTable
            FOR XML PATH(''), TYPE  
            ).value('.', 'NVARCHAR(MAX)')   
        ,1,1,'')  

//erstellen des Queries, basierend auf den dynamisch ermittelten Namen    
set @query = 'SELECT MASKE, ' + @cols + ' from   
            (
                select MASKE
                    , NAME
		    , ''x'' as "isin"  
                    
                from myTable
           ) x
            pivot 
            (
                 max([isin])
                for NAME in (' + @cols + ')  
            ) p '  

//ausführen des Queries
execute(@query)

Quelle: https://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-qu ...

Ergebnis:
MASKE                            hose jacke meier mueller schmidt schulze socke
-------------------------------- ---- ----- ----- ------- ------- ------- -----
einkauf                          NULL x     x     x       x       NULL    x
fibu                             NULL NULL  NULL  NULL    NULL    x       NULL
materialwirtschaft               NULL NULL  NULL  NULL    x       NULL    NULL
produktion                       NULL NULL  x     NULL    NULL    NULL    NULL
projekte                         x    NULL  NULL  NULL    NULL    NULL    NULL
verkauf                          x    x     x     x       NULL    NULL    NULL

(6 rows affected)
WiSch
WiSch 24.01.2023 um 14:15:42 Uhr
Goto Top
Hallo em-pie.

Das bringt mir genau das gesuchte Ergebnis.
Ich habe es, nun wo ich es sehe, fast auch in Gänze verstanden, werde aber wohl noch was dazu nachlesen müssen.

Ich konnte noch weitere Filter und eine Sortierung einbauen, bringt nun - wie gesagt - exakt meine gesuchte Liste.

Vielen Dank dafür!

Grüße,
WiSch