Unpivot / Pivot

Nappo

Benutzer
Beiträge
11
Hallo,

ich komme mit einer Anforderung nicht klar.

Ich muss diverse Felder einer Tabelle als einzelne Datensätze darstellen. Hier meine "normale" Abfrage

Code:
select Nummer, Kundennummer, Name1, Status from vorgang

>Nummer    Kundennummer    Name1         Status
10002    10000            Dietrich      Neu

So soll es am Ende aussehen
Code:
Nummer; 10002
Kundennummer; 10000
Name1;Dietrich
Ststus; Neu


Zwar finde ich diverse Erklärungen und Beispiele, ich bekomme aber keines zum laufen.
Hier mal (mein vermutlich 500.er) Versuch:
select Nummer, Kundennummer, Name1, Status from
(Select Nummer, Kundennummer from vorgang )VG
unpivot
(Nummer for Kundennummer in (Kundennummer)) as ERG
 
Werbung:
Du musst nach unpivot die Key Felder aufzählen und künstlich die Spaltennamen angeben, z.B.
Code:
UNPIVOT [Value] FOR [Key]

hier ist ein Beispiel mit 2 Varianten, das 2. Beispiel erzeugt eine Extraspalte, die nochmals für alle KV Zeilen eine geeignete ID zur Zuordnung ausgibt:
 
Du musst nach unpivot die Key Felder aufzählen und künstlich die Spaltennamen angeben, z.B.
Code:
UNPIVOT [Value] FOR [Key]

hier ist ein Beispiel mit 2 Varianten, das 2. Beispiel erzeugt eine Extraspalte, die nochmals für alle KV Zeilen eine geeignete ID zur Zuordnung ausgibt:
Danke, das hilft mir beim Verständnis. Ich selektiere also die Felder die ich als Feldnamen "sehen" will...
Code:
        (SELECT Name1, Status, Kundennummer, Nummer  FROM vorgang)

und hier dann die einzelnen Datensätze dazu

Code:
          SELECT Vorgang,Value
    FROM CTE  
 UNPIVOT(Value FOR [KEY]IN           
        (Name1, Status, Kundennummer, Nummer) ) AS unpvt

Hier bekomme ich eine Fehlermeldung
"Der Typ der Kundennummer-Spalte steht in Konflikt mit dem Typ anderer Spalten, die in der UNPIVOT-Liste angegeben sind."

Müssen alle Felder vom selben Typ sein?
 
Du könntest das auch mit XML angehen, hier ein Beispiel:
Die XML Tags lassen sich sicher noch etwas optimieren, dann in Text konvertieren, dann die Tags anpassen.
 
Langsam kommt Verzweiflung auf.... Ich probiere und probiere, komme aber auf kein Ergebnis. Was mache ich falsch?
Die genannten Felder sind alle VARCHAR(10), das Feld Kundennummer vom Typ INT.
Den vorgschlagenen Script habe ich wie folgt angepasst:

Code:
WITH CTE AS
        (SELECT Name1, Status, CAST(Kundennummer AS VARCHAR(10)) as Kundennummer, Nummer
           FROM vorgang)
  SELECT [Key],Value
    FROM CTE 
 UNPIVOT(Value FOR [Key] IN           
        (Name1, Status,  Kundennummer, Nummer) ) AS unpvt

Mit dem "Erfolg":

Code:
Meldung 8167, Ebene 16, Status 1, Zeile 16
Der Typ der Kundennummer-Spalte steht in Konflikt mit dem Typ anderer Spalten, die in der UNPIVOT-Liste angegeben sind.

Folgende Anpassung:

Code:
WITH CTE AS
        (SELECT Name1, Status, CAST(Kundennummer AS VARCHAR(10)) as Kundennummer, Nummer
           FROM vorgang)
  SELECT [Key],Value
    FROM CTE 
 UNPIVOT(Value FOR [Key] IN           
        (Name1, Status,  CAST(Kundennummer AS VARCHAR(10)) as Kundennummer, Nummer) ) AS unpvt

fruchtet auch nicht:


Code:
Meldung 102, Ebene 15, Status 1, Zeile 16
Falsche Syntax in der Nähe von "(".
(Wobei mir diese Meldung völlig unklar ist...)
Wo liegt mein Fehler?
 
Hi @Nappo, ich hab hier mal einen Link some of my greatest mistakes, der Dir evtl. weiterhelfen kann. Ich glaube nämlich, dass die Spalte Kundennummer im UNPIVOT sich auf die Tabelle vorgang direkt bezieht und im UNIPIVOT der Cast gar nicht ankommt. Das würde auch die Fehlermeldung 8167 erklären.
 
Werbung:
Die genannten Felder sind alle VARCHAR(10), das Feld Kundennummer vom Typ INT.
Bist Du sicher? Es ist immer gut, die Punkte kurz zu prüfen, wo man sich später an den Kopf klatscht (nach dem Motto "ich dachte die ganze Zeit dass ...").
Schau Dir ein paar Beispiele an, die Meldung kommt ganz schlicht bei unterschiedlichen Typen.

Solche Dinge sind übrigens typische Probleme in Foren. Niemand hier kennt Deine Tabellen und damit auch nicht die Typen der Spalten, also kann Dich erstmal niemand vor solchen Fehlern bewahren oder warnen. Daher postet man gerne komplette, nachvollziehbare Beispiele für sein Problem.

UNPIVOT(Value FOR [Key] IN (Name1, Status, CAST(Kundennummer AS VARCHAR(10)) as Kundennummer,
Das macht auch keinen Sinn, es ist lediglich die Aufzählung der Keyfelder. Da macht eine Typangabe wenig Sinn.

Versuche entweder alle Spalten gleich zu casten oder schau die Spalten Deiner Tabelle exakt nach. (Es ist meist unwahrscheinlich, dass alle Spalten den gleichen Typ haben, also ist ein pauschaler Cast aller Spalten auf einen Typ vielleicht nicht verkehrt.)
 
Zurück
Oben