Tabellarische Darstellung von Daten aus einer SQL Tabelle
Hallo Gemeinschaft,
ich habe eine SQL Tabelle -
sie sieht ungefähr so aus
Es sind Details zu Buchungen von Ferienhäusern
id_ferienhausid_checkin_checkout_optionen.......
checkin und checkout - hier sind jeweils Datumsangaben drin
nun wird es trickiger
das Feld Optionen sieht so aus (es ist ein textfeld)
{"2":{"name":"Kinderhochstuhl","amount":"5.00","amount_children":"0.00","apply_to_type":"quantity","quantity":2},"3":{"name":"Kinderreisebett","amount":"7.00","amount_children":"0.00","apply_to_type":"quantity","quantity":2},"4":{"name":"Bettw\u00e4sche pro Person","amount":"15.00","amount_children":"0.00","apply_to_type":"quantity","quantity":8},"5":{"name":"Frottee - W\u00e4schepaket (Duschtuch, Handtuch, Badvorleger)","amount":"8.00","amount_children":"0.00","apply_to_type":"quantity","quantity":8}}
nun möchte ich gerne eine Jahrestabelle haben - mit Skalierung Tag
hier soll dann pro Tag die Summe (von quantity) stehen von Kinderreisebett
könnt ihr mir dabei bitte helfen
ich habe eine SQL Tabelle -
sie sieht ungefähr so aus
Es sind Details zu Buchungen von Ferienhäusern
id_ferienhausid_checkin_checkout_optionen.......
checkin und checkout - hier sind jeweils Datumsangaben drin
nun wird es trickiger
das Feld Optionen sieht so aus (es ist ein textfeld)
{"2":{"name":"Kinderhochstuhl","amount":"5.00","amount_children":"0.00","apply_to_type":"quantity","quantity":2},"3":{"name":"Kinderreisebett","amount":"7.00","amount_children":"0.00","apply_to_type":"quantity","quantity":2},"4":{"name":"Bettw\u00e4sche pro Person","amount":"15.00","amount_children":"0.00","apply_to_type":"quantity","quantity":8},"5":{"name":"Frottee - W\u00e4schepaket (Duschtuch, Handtuch, Badvorleger)","amount":"8.00","amount_children":"0.00","apply_to_type":"quantity","quantity":8}}
nun möchte ich gerne eine Jahrestabelle haben - mit Skalierung Tag
hier soll dann pro Tag die Summe (von quantity) stehen von Kinderreisebett
könnt ihr mir dabei bitte helfen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1910753530
Url: https://administrator.de/contentid/1910753530
Ausgedruckt am: 25.11.2024 um 08:11 Uhr
12 Kommentare
Neuester Kommentar
ich versteh grad nicht was Du mit 'Jahrestabelle' meinst, aber Deine Daten da im Optionen-Feld sind JSON - Daten und können z.B. so abgefragt werden:
edb=*# create table jhaustein(data jsonb);
CREATE TABLE
edb=*# insert into jhaustein values ('{"2":{"name":"Kinderhochstuhl","amount":"5.00","amount_children":"0.00","apply_to_type":"quantity","quantity":2},"3":{"name":"Kinderreisebett","amount":"7.00","amount_children":"0.00","apply_to_type":"quantity","quantity":2},"4":{"name":"Bettw\u00e4sche pro Person","amount":"15.00","amount_children":"0.00","apply_to_type":"quantity","quantity":8},"5":{"name":"Frottee - W\u00e4schepaket (Duschtuch, Handtuch, Badvorleger)","amount":"8.00","amount_children":"0.00","apply_to_type":"quantity","quantity":8}}');
INSERT 0 1
edb=*# select data -> '3' ->> 'amount' from jhaustein ;
?column?
----------
7.00
(1 row)
bitte kein Crossposting, siehe https://www.datenbankforum.com/threads/sql-abfrage.6251/#post-37548
Die Frage habe ich an diversen Stellen schon mehrfach beantwortet, siehe https://www.pg-forum.de/t/faq-zeilen-zu-spalten/4828
Die Frage habe ich an diversen Stellen schon mehrfach beantwortet, siehe https://www.pg-forum.de/t/faq-zeilen-zu-spalten/4828
Um es Dir etwas einfacher zu machen, hier mal ein Beispiel. Damit ich nicht immer jedes mal die Anzahl der Kinderbetten aus dem JSON rauspopeln muß unter Verwendung einer berechneten Spalte. Außerdem mit DATERANGE für die belegungen.
Los geht's:
Los geht's:
postgres=# create table jhaustein(id int generated always as identity primary key, belegt daterange, data jsonb, Kinderreisebett_amount int generated always as ((data -> '3' ->> 'amount')::numeric::int) stored);
CREATE TABLE
postgres=# insert into jhaustein (belegt, data) values ('[2022-02-01,2022-02-20)','{"2":{"name":"Kinderhochstuhl","amount":"5.00","amount_children":"0.00","apply_to_type":"quantity","quantity":2},"3":{"name":"Kinderreisebett","amount":"7.00","amount_children":"0.00","apply_to_type":"quantity","quantity":2},"4":{"name":"Bettw\u00e4sche pro Person","amount":"15.00","amount_children":"0.00","apply_to_type":"quantity","quantity":8},"5":{"name":"Frottee - W\u00e4schepaket (Duschtuch, Handtuch, Badvorleger)","amount":"8.00","amount_children":"0.00","apply_to_type":"quantity","quantity":8}}');
INSERT 0 1
postgres=#
postgres=# \x
Expanded display is on.
postgres=# select * from jhaustein;
-[ RECORD 1 ]----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
id | 1
belegt | [2022-02-01,2022-02-20)
data | {"2": {"name": "Kinderhochstuhl", "amount": "5.00", "quantity": 2, "apply_to_type": "quantity", "amount_children": "0.00"}, "3": {"name": "Kinderreisebett", "amount": "7.00", "quantity": 2, "apply_to_type": "quantity", "amount_children": "0.00"}, "4": {"name": "Bettwäsche pro Person", "amount": "15.00", "quantity": 8, "apply_to_type": "quantity", "amount_children": "0.00"}, "5": {"name": "Frottee - Wäschepaket (Duschtuch, Handtuch, Badvorleger)", "amount": "8.00", "quantity": 8, "apply_to_type": "quantity", "amount_children": "0.00"}}
kinderreisebett_amount | 7
postgres=# select case when belegt @> '2022-01-30'::date then kinderreisebett_amount else 0 end as "2022-01-30", case when belegt @> '2022-02-02'::date then kinderreisebett_amount else 0 end as "2022-02-02" from jhaustein;
2022-01-30 | 2022-02-02
------------+------------
0 | 7
(1 row)
ich glaube, Du willst noch ein SUM() um die CASE-Ausdrücke. Hier korrekt und noch ein weiterer Datensatz:
Falls Du MySQL im Einsatz hast (siehe anderes Forum) gehen natürlich die schönen Dinge wie Extraktion aus dem JSON, berechnete Felder, DATERANGE etc. allesamt nicht - das Grundprinzip bleibt aber.
postgres=# insert into jhaustein (belegt, data) values ('[2022-01-21,2022-02-10)','{"2":{"name":"Kinderhochstuhl","amount":"5.00","amount_children":"0.00","apply_to_type":"quantity","quantity":2},"3":{"name":"Kinderreisebett","amount":"17.00","amount_children":"0.00","apply_to_type":"quantity","quantity":2},"4":{"name":"Bettw\u00e4sche pro Person","amount":"15.00","amount_children":"0.00","apply_to_type":"quantity","quantity":8},"5":{"name":"Frottee - W\u00e4schepaket (Duschtuch, Handtuch, Badvorleger)","amount":"8.00","amount_children":"0.00","apply_to_type":"quantity","quantity":8}}');
INSERT 0 1
postgres=#
postgres=#
postgres=# select sum(case when belegt @> '2022-01-30'::date then kinderreisebett_amount else 0 end) as "2022-01-30", sum(case when belegt @> '2022-02-02'::date then kinderreisebett_amount else 0 end) as "2022-02-02" from jhaustein;
2022-01-30 | 2022-02-02
------------+------------
17 | 24
(1 row)
postgres=#
Falls Du MySQL im Einsatz hast (siehe anderes Forum) gehen natürlich die schönen Dinge wie Extraktion aus dem JSON, berechnete Felder, DATERANGE etc. allesamt nicht - das Grundprinzip bleibt aber.
naja, Dein erstes Problem ist erst einmal, aus dem Textfeld die Anzahlen da rauszubekommen. Wer auch immer auf die Idee kam, da JSON-Dokumente als TEXT zu speichern sollte sich in die Ecke stellen und sich lebenslänglich schämen.
Das dann mittels sum(case ...)) für jeden Tag des Jahres aufzuaggregieren ist dann nur noch eine Fleißaufgabe - ich hab es zur Demo bei 2 Tagen belassen. Hätte ich sowas vor würde ich dazu wohl eine Funktion in plpgsql schreiben.
Also, wie gesagt: löse erst einmal das Problem, da die gewünschten Anzahlen rauszupopeln, das sind ca. 99% dessen, was Du da leisten mußt. Vermutlich wäre ein Umstieg auf eine bessere Datenbank schneller durchführbar ...
Das dann mittels sum(case ...)) für jeden Tag des Jahres aufzuaggregieren ist dann nur noch eine Fleißaufgabe - ich hab es zur Demo bei 2 Tagen belassen. Hätte ich sowas vor würde ich dazu wohl eine Funktion in plpgsql schreiben.
Also, wie gesagt: löse erst einmal das Problem, da die gewünschten Anzahlen rauszupopeln, das sind ca. 99% dessen, was Du da leisten mußt. Vermutlich wäre ein Umstieg auf eine bessere Datenbank schneller durchführbar ...
Selbstverständlich nicht!
im anderen Forum war es MySQL - was es auch nicht viel besser macht.