MY SQL Zeilen in Spalten
Hi ihr,
ich suche eine Möglichkeit meine Tabelle PIVOT zu machen.
Meine Tablle sieht wie folgt aus:
VarName TimeString VarValue
Test 1 17.08.2018 07:45:00 320
Test 1 raum 17.08.2018 07:45:00 300
Test 2 17.08.2018 18:00:00 360
Test 2 raum 17.08.2018 18:00:00 301
Natürlich ist das nur eine vereinfachte Darstellung ich hab unter der Uhrzeit noch viel mehr werte.
Brauchen tue ich jetzt:
TimeString Test 1 Test 1 Raum Test 2 Test 2 Raum
17.08.2018 07:45:00 320 300
17.08.2018 18:00:00 360 301
Im Prinzip will ich meine Zeilen zu Spalten ändern und es Gruppieren anhand von TimeString.
Ich hab schon Probiert.
select TimeString
,(select VarName from tablle_rohdaten where VarName = Test 1) as Test 1
,(select VarName from tablle_rohdaten where VarName = Test 1 Raum) as Test 1 Raum
,(select VarName from tablle_rohdaten where VarName = Test 2) as Test 2
,(select VarName from tablle_rohdaten where VarName = Test 2 Raum) as Test 2 Raum
from tablle_rohdaten
Nur leider bekomm ich nichtmal die ausgabe ich bekomme nur: Reference 'Test 1' not supported (forwad reference in item list)
ich bin mir sicher es geht irgendwie... ich brauch bloß wieder hilfe wie.
Ich bedanke mich im Voraus.
Marcel
PS: ich nutze MySQL
ich suche eine Möglichkeit meine Tabelle PIVOT zu machen.
Meine Tablle sieht wie folgt aus:
VarName TimeString VarValue
Test 1 17.08.2018 07:45:00 320
Test 1 raum 17.08.2018 07:45:00 300
Test 2 17.08.2018 18:00:00 360
Test 2 raum 17.08.2018 18:00:00 301
Natürlich ist das nur eine vereinfachte Darstellung ich hab unter der Uhrzeit noch viel mehr werte.
Brauchen tue ich jetzt:
TimeString Test 1 Test 1 Raum Test 2 Test 2 Raum
17.08.2018 07:45:00 320 300
17.08.2018 18:00:00 360 301
Im Prinzip will ich meine Zeilen zu Spalten ändern und es Gruppieren anhand von TimeString.
Ich hab schon Probiert.
select TimeString
,(select VarName from tablle_rohdaten where VarName = Test 1) as Test 1
,(select VarName from tablle_rohdaten where VarName = Test 1 Raum) as Test 1 Raum
,(select VarName from tablle_rohdaten where VarName = Test 2) as Test 2
,(select VarName from tablle_rohdaten where VarName = Test 2 Raum) as Test 2 Raum
from tablle_rohdaten
Nur leider bekomm ich nichtmal die ausgabe ich bekomme nur: Reference 'Test 1' not supported (forwad reference in item list)
ich bin mir sicher es geht irgendwie... ich brauch bloß wieder hilfe wie.
Ich bedanke mich im Voraus.
Marcel
PS: ich nutze MySQL
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 383874
Url: https://administrator.de/contentid/383874
Ausgedruckt am: 22.11.2024 um 17:11 Uhr
13 Kommentare
Neuester Kommentar
Ich bin nicht so fit in MySQL aber ich glaube ein explizites PIVOT wie in MSSQL gibt es da nicht. Wenn es bei den vier Spalten bleibt würde ich einen klassischen Join empfehlen und nicht so gruselige Subselects:
PS: Dein Code ergibt keinen Sinn, da müsste ja zumindest VarValue und nicht VarName selektiert werden und es fehlt ein Bezug zum TimeString. Wenn es mehrere TimeString mit dem VarName gibt werden im Subselect mehr als ein Wert ermittelt und es knallt.
SELECT t.TimeString,
t1.VarValue AS test1,
t2.VarValue AS test1_raum,
t3.VarValue AS test2,
t4.VarValue AS test2_raum
FROM (
SELECT TimeString
FROM table_rohdaten
GROUP BY TimeString
) t
LEFT JOIN table_rohdaten t1 ON t.TimeString = t1.TimeString AND t1.VarName = 'Test 1'
LEFT JOIN table_rohdaten t2 ON t.TimeString = t2.TimeString AND t2.VarName = 'Test 1 Raum'
LEFT JOIN table_rohdaten t3 ON t.TimeString = t3.TimeString AND t3.VarName = 'Test 2'
LEFT JOIN table_rohdaten t4 ON t.TimeString = t4.TimeString AND t4.VarName = 'Test 2 Raum'
PS: Dein Code ergibt keinen Sinn, da müsste ja zumindest VarValue und nicht VarName selektiert werden und es fehlt ein Bezug zum TimeString. Wenn es mehrere TimeString mit dem VarName gibt werden im Subselect mehr als ein Wert ermittelt und es knallt.
Geht denn
Das muss was MariaDB spezifisches sein, ich kann mir den Fehler nicht ganz erklären.
PS: Probiers mal mit ) AS t
SELECT t.*
FROM (
SELECT TimeString
FROM table_rohdaten
GROUP BY TimeString
) t
Das muss was MariaDB spezifisches sein, ich kann mir den Fehler nicht ganz erklären.
PS: Probiers mal mit ) AS t
SELECT t.TimeString,
t1.VarValue AS test1,
t2.VarValue AS test1_raum,
t3.VarValue AS test2,
t4.VarValue AS test2_raum
FROM (
SELECT TimeString
FROM table_rohdaten
GROUP BY TimeString
) AS t
LEFT JOIN table_rohdaten t1 ON t.TimeString = t1.TimeString AND t1.VarName = 'Test 1'
LEFT JOIN table_rohdaten t2 ON t.TimeString = t2.TimeString AND t2.VarName = 'Test 1 Raum'
LEFT JOIN table_rohdaten t3 ON t.TimeString = t3.TimeString AND t3.VarName = 'Test 2'
LEFT JOIN table_rohdaten t4 ON t.TimeString = t4.TimeString AND t4.VarName = 'Test 2 Raum'
Also bei mir funktioniert
ganz hervorragend. Vielleicht läßt es sich auch explizit mit convert() machen.
Grundsätzlich gilt: Bring deine Daten am besten schon in der Tabelle in das richtige Format, also dauerhaft DATETIME. Wenn das nicht möglich ist: Es kann zu Problemen mit cast() und vor allem in Verbindung mit verschiedenen Spracheinstellungen des SQL Servers kommen. Je nachdem ob der Server EN oder DE als Default Sprache ansieht interpretiert der anders denn die Amis schreiben ja erst Monat, dann Tag. Wenn das also auf verschiedenen Clients / Servern ausgeführt wird verhält sich cast() möglicherweise unterschiedlich, dann kann convert() Vorteile haben.
SELECT cast('21.08.2018 13:00:00' AS DATETIME)
Grundsätzlich gilt: Bring deine Daten am besten schon in der Tabelle in das richtige Format, also dauerhaft DATETIME. Wenn das nicht möglich ist: Es kann zu Problemen mit cast() und vor allem in Verbindung mit verschiedenen Spracheinstellungen des SQL Servers kommen. Je nachdem ob der Server EN oder DE als Default Sprache ansieht interpretiert der anders denn die Amis schreiben ja erst Monat, dann Tag. Wenn das also auf verschiedenen Clients / Servern ausgeführt wird verhält sich cast() möglicherweise unterschiedlich, dann kann convert() Vorteile haben.