marcel1989
Goto Top

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

Content-ID: 383874

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

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

ukulele-7
ukulele-7 20.08.2018 aktualisiert um 08:48:07 Uhr
Goto Top
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:
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.
Marcel1989
Marcel1989 20.08.2018 um 08:54:58 Uhr
Goto Top
/* SQL Fehler (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'FROM (SELECT TimeString FROM table_rohdaten GROUP BY TimeString)
LEFT JOIN tab' at line 5 */

hm da bekomme ich leider genau den Fehler.
Marcel1989
Marcel1989 20.08.2018 um 08:58:04 Uhr
Goto Top
mir ist aufgefallen ich hab die Ansicht der Tabelle falsch dargestellt. Hier ein Bild.
unbenannt
ukulele-7
ukulele-7 20.08.2018 um 09:13:11 Uhr
Goto Top
Hinter GROUP BY TimeString) und vor dem LEFT JOIN fehlt ein t in deiner Fehlermeldung, hast du das mit kopiert?
Marcel1989
Marcel1989 20.08.2018 um 09:30:30 Uhr
Goto Top
hi, ja hab ich mitkopiert

/* SQL Fehler (1064): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'FROM (SELECT TimeString FROM tabele_rohdaten GROUP BY TimeString)t
LEFT JOIN tab' at line 5 */

hatte es dann für einen Fehler gehalten und entfernt... aber die Fehlermeldung blieb die gleiche face-smile
ukulele-7
Lösung ukulele-7 20.08.2018 aktualisiert um 10:06:14 Uhr
Goto Top
Geht denn
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'  
Marcel1989
Marcel1989 20.08.2018 um 10:58:15 Uhr
Goto Top
Zitat von @ukulele-7:

Geht denn
SELECT t.*
> FROM (
> SELECT TimeString
> FROM table_rohdaten
> GROUP BY TimeString
> ) t

Ja der Code geht.



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'  

der Code geht auch. und es ist genau das was ich will... nun muss ich es nur noch in eine Tabelle Schreiben lassen damit die immer aktuell ist face-smile
Super! ich danke dir wirklich!
ukulele-7
ukulele-7 20.08.2018 um 11:29:58 Uhr
Goto Top
Wiso in die Tabelle schreiben, das ist ja dann redundant. Du kannst das als View anlegen oder so, das macht mehr Sinn.
Marcel1989
Marcel1989 22.08.2018 aktualisiert um 16:27:25 Uhr
Goto Top
Naja ich habs jetzt als View in einer SQL ausgegeben. Ich brauch nochmal Hilfe.
Zum einen ist mein TimeString Feld ein Text mit dem Inhalt 01.08.2018 13:00:00 (als Beispiel) wie kann ich das nun in ein reines Datums Feld ändern?


Zum Zweiten ich hab viele Null Zeilen. kann ich den irgendwie selektieren das diese dann nicht mit ausgegeben werden?

Gruß
Marcel

Edit:
Das mit den NULL Werten hat sich erledigt... ich hätte mich nur mal konzentrieren sollen... Danke euch Trotzdem

PS: danke für die Hilfe schonmal vorab.
ukulele-7
ukulele-7 23.08.2018 um 10:30:43 Uhr
Goto Top
Also bei mir funktioniert
SELECT cast('21.08.2018 13:00:00' AS DATETIME)  
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.
Marcel1989
Marcel1989 23.08.2018 um 11:56:34 Uhr
Goto Top
Hm...
Also das hängt mit dem ersten Punkt zusammen.
mein TimeString ist eben dieses 21.08.2018 13:00:00 und ich hätte gerne am ende ein Feld (zusätzlich) als reines Date.
deshalb die frage nach dem Convert...
aber bei mir klappt es nicht so richtig. (aber ist bestimmt nur ein Syntax error. Ich probier es weiter)
Marcel1989
Marcel1989 23.08.2018 um 13:46:55 Uhr
Goto Top
LEFT JOIN misch_rohdaten t9 on t.TimeString = t9.TimeString DATE_FORMAT(t9.TimeString, '%y.%m.%d %H:%i:%s')  

ich seh gerade nicht meinen Fehler...
ukulele-7
ukulele-7 23.08.2018 um 14:03:47 Uhr
Goto Top
Ach sry ist ja MySQL nicht MS SQL. Da bin ich leider nicht fitt aber irgendwie wird es gehen. Wo der Fehler liegt sehe ich aber auch nicht.