jhaustein
Goto Top

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

Content-ID: 1910753530

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

Ausgedruckt am: 25.11.2024 um 08:11 Uhr

akretschmer
akretschmer 14.02.2022 aktualisiert um 11:41:22 Uhr
Goto Top
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)
jhaustein
jhaustein 14.02.2022 um 11:43:26 Uhr
Goto Top
Hallo - lieben Dank für deine Antwort

ich meine es so

1.1.__2.1.___3.1__4.1.........
5____6_____4____5......
akretschmer
akretschmer 14.02.2022 um 11:49:38 Uhr
Goto Top
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
akretschmer
akretschmer 14.02.2022 um 12:13:27 Uhr
Goto Top
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:

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)
akretschmer
akretschmer 14.02.2022 um 12:57:36 Uhr
Goto Top
ich glaube, Du willst noch ein SUM() um die CASE-Ausdrücke. Hier korrekt und noch ein weiterer Datensatz:

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.
jhaustein
jhaustein 14.02.2022 um 13:29:19 Uhr
Goto Top
lieben Dank für deine Mühe - weiss nur ehrlich gesagt nicht, wo ich diesen code wie ausführen kann
akretschmer
akretschmer 14.02.2022 um 13:53:48 Uhr
Goto Top
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 ...
jhaustein
jhaustein 14.02.2022 um 14:20:51 Uhr
Goto Top
kennst du dich mit access aus
akretschmer
akretschmer 14.02.2022 um 14:22:04 Uhr
Goto Top
Zitat von @jhaustein:

kennst du dich mit access aus

Selbstverständlich nicht!
ukulele-7
ukulele-7 15.02.2022 um 10:09:32 Uhr
Goto Top
Access und JSON? Bist du sicher das du Access verwendest?
akretschmer
akretschmer 15.02.2022 um 10:38:49 Uhr
Goto Top
Zitat von @ukulele-7:

Access und JSON? Bist du sicher das du Access verwendest?

im anderen Forum war es MySQL - was es auch nicht viel besser macht.
ukulele-7
ukulele-7 15.02.2022 um 11:05:00 Uhr
Goto Top
Sieht auch so aus als gehe es um irgend ein CMS, die laufen i.d.R. auf MySQL oder MariaDB.