Komplexe Abfrage

ThomasZTH

Benutzer
Beiträge
5
Hallo Zusammen,
ich komm da einfach nicht weiter... Experte sein ist nicht einfach. :(

Mein Problem ohne Lösung sieht so aus:

Tabelle:
id | form_id | entry_id | meta_key | meta_value |
1 | 6| 100 | 7 |760001 |
2 | 6| 100 | 40 |07:00 |
3 | 6 | 100 | 28 | 08:00 |
4 | 6 | 101 | 7 |760002
5 | 6| 101 | 40 |10:00 |
6 | 6 | 101 | 28 | 13:00 |
7 | 6 | 102 | 7 |760002
8 | 6| 102 | 40 |10:00 |
9 | 6 | 102 | 28 | 13:00 |

Diese Daten hätte ich jetzt gerne Ausgelesen und in einer neuen Tabelle gespeichert.
Ergebnis:
Tournummer | Start | Ende |
760001 | 07:00 | 08:00 |
760002 | 10:00 | 13:00 |

Danke.
 
Werbung:
Code:
test=*# select * from thomaszth ;
 entry_id | meta_key | meta_value
----------+----------+------------
      100 |        7 | 760001
      100 |       40 | 07:00
      100 |       28 | 08:00
      101 |        7 | 760002
      101 |       40 | 10:00
      101 |       28 | 13:00
      102 |        7 | 760003
      102 |       40 | 10:00
      102 |       28 | 13:00
(9 rows)

test=*# select string_agg(meta_value,'') filter (where meta_key = 7) as tour, string_agg(meta_value,'') filter (where meta_key = 40) as start, string_agg(meta_value,'') filter (where meta_key = 28) as ende from thomaszth group by entry_id;
  tour  | start | ende  
--------+-------+-------
 760001 | 07:00 | 08:00
 760002 | 10:00 | 13:00
 760003 | 10:00 | 13:00
(3 rows)

test=*#

Klitzekleines Problem: ich verwende PostgreSQL.
 
Guten morgen,
das hat nicht so gepasst bei MySQL.
Habe aber mit hilfe deines Beispiels folgende Lösung gefunden.

SELECT
MAX(CASE WHEN meta_key = 7 THEN meta_value END) AS Tournummer,
MAX(CASE WHEN meta_key = 40.1 THEN meta_value END) AS Montag,
MAX(CASE WHEN meta_key = 40.2 THEN meta_value END) AS Dienstag,
MAX(CASE WHEN meta_key = 40.3 THEN meta_value END) AS Mittwoch,
MAX(CASE WHEN meta_key = 40.4 THEN meta_value END) AS Donnerstag,
MAX(CASE WHEN meta_key = 40.5 THEN meta_value END) AS Freitag,
MAX(CASE WHEN meta_key = 40.6 THEN meta_value END) AS Samstag,
MAX(CASE WHEN meta_key = 40.7 THEN meta_value END) AS Sonntag,
MAX(CASE WHEN meta_key = 38 THEN meta_value END) AS Start,
MAX(CASE WHEN meta_key = 39 THEN meta_value END) AS End,
MAX(CASE WHEN meta_key = 28 THEN meta_value END) AS Tourgebiet
FROM `table` WHERE form_id = 6 GROUP BY entry_id

Das sieht auch soweit gut aus.

Eine Frage habe ich noch. Wie man sieht, liste ich die Tage auf also Montag bis Sonntag. Gibt es eine Lösung diese in eine Tabellenspalte mit kommas getrennt zu bekommen?

Beispiel:

Montag, Dienstag, usw.

die Daten werden in der Tabelle aus der ich die Daten hole so gespeichert: 1 2 3 4 5 6 7

Was ist wenn kein Tag in der Tabelle angegeben wird. Also die 40.7 ist leer. In der jetzigen abfrage bekomme ich dann eine NULL. Die möchte ich nicht. :-)

Danke.
 
Werbung:
Warum mit Komma getrennt, ein Wert kann nur einen Wert enthalten, also Deine meta_key kann nur 40.1 oder 40.7 oder so sein, nicht mehrere Werte gleichzeitig.

Code:
test=*# with t as (select 3 as t) select case when t = 1 then 'Montag' else '' end || case when t = 2 then 'Dienstag' else ''end || case when t = 3 then 'Mittwoch' else '' end as tag, t from t;
   tag    | t
----------+---
 Mittwoch | 3
(1 row)

Wenn Du statt NULL z.B. '' haben willst, dann sage es einfach, siehe oben. Oder nutze coalesce().
 
Zurück
Oben