Hilfe bei Pivot - oder Transformation von Zeilen in Spalten

Es gibt keine Spalte Tanks in Deinem Statement. Ich nehme an Du meinst die Spalten, die nach den individuellen Tanks benannt sind.

Ich rate mal oder sagen wir so, ich würde es nie absichtlich so "bequem" machen. Schon gar nicht bei einem Union, wo man die Typen einhalten muss.
Lange Erklärung:
Du hast in allen 3 Tanks Spalten die Case Statements. Das könnte eine Copy / Paste Lösung sein oder Du hast verstanden, was da passiert. Du erzeugst fallweise (oder spaltenweise) ein Ergebnis, das mehrzeilig ist und kannst es anschließend per Aggregatfunktion (max) zu einer Zeile zusammenfassen. Die Case Formulierung ist in Deinem Statement etwas schlampig / sparsam. Case ist außerdem etwas "gemein", weil es durch beliebige Fallunterscheidung mit individuellen Ausgabewerten auch individuelle AusgabeTYPEN produzieren kann:
Code:
..case when 'heute' then getdate()
case when 'morgen' then 1
case when 'jetzt' then jetzt
case when 'mirdochegal' then '42'
...
Würde so kein Mensch machen, aber Du bist nah dran. Obwohl Du die Konvertierung machst.
In Deinem Statement fehlt der ELSE Teil- wie in meinem Beispiel. Er findet aber statt! "da kommt ja sowieso nichts raus", könnte man meinen, ist ja auch so, man produziert ein NULL Ergebnis. Aber von welchem Typ?
Hättest Du eine Datenbank entwickelt und das Case When Statement implementiert, welchen Typ hättest Du dem Ergebnis verpasst?

kurze Antwort:
Versuch mal, ein Else dazu mit Convert oder direkt ein Convert um das ganze Case Ergebnis, eben nicht nur im Then Teil.

Und unabhängig davon ob das die Lösung ist.
Man sollte sich nie auf implizite Typkonvertierung verlassen. (Und man muss vielleicht ein wenig üben, um es nicht unabsichtlich zu machen)
Vielen Dank für deine lange Erklärung, ich schaue es mir einmal an :-)
 
Werbung:
Also erstmal vorab: Da es sich ja um eine sehr statische Lösung handelt wäre der Ansatz von @dabadepdu auch meiner, viele Joins - Augen zu und durch. Natürlich müssen alle Spalten das selbe Format haben und da bist du ja schon dabei, sollte nicht so schwer sein. Die Geschwindigkeit wird auch nie ein Problem werden bei der kleinen Datenmenge.

Elegant ist das natürlich nicht so richtig, daher habe ich mir das eben nochmal angeschaut. Mir spukt eine Lösung durch den Kopf basierend auf der Möglichkeit Daten relativ einfach als XML darstellen zu können in einem Format, was dem gewünschten gar nicht so unähnlich ist. Also z.B.
Code:
WITH View_Prozessdaten(Tank,Wert,Bezeichnung,Material1,Material2) AS (
    SELECT 1,15,'Tomatenmark',711,712 UNION ALL
    SELECT 2,115,'Chili-Soße',715,153 UNION ALL
    SELECT 3,135,'Käsesoße',586,578 UNION ALL
    SELECT 4,95,'Knoblauchsoße',899,145
    )
SELECT    *
FROM    View_Prozessdaten
FOR XML RAW
Das Ergebnis müsste natürlich hier auch noch pivotiert werden, hätte aber erstmal keinen eigenen Datentyp mehr. Ich habe ein wenig probiert und gesucht und auch was gefunden, dabei ist mir aber die Lust mächtig vergangen.

Es scheint jedenfalls nicht wirklich einen guten use case für ein pivot von einem XML zu geben. Da ist der stumpfeste Weg deutlich schneller erledigt.
 
Zurück
Oben