Überschriften ersetzen aus Referenztabelle

topias1000

Benutzer
Beiträge
8
Hallo Datenbankforum,
ich bin gerade bei meinen ersten Schritten mit SQL und stehe vor folgendem Problem (zu dem ich durch googlen leider keine Lösung gefunden habe - vllt weil mir die korrekten Begriffe fehlen):
ich habe zwei Tabellen:
- "001"
- "001_Params"
In der Tabelle "001" lauten die Spaltenüberschriften zB "v03". In der Tabelle "001_Params" gibt es ein Feld "ID" welches zB die 3 enthält. Außerdem ein Feld "Name", da steht dann z.B. "Temperatur".
Nun würde ich gerne über eine Abfrage alle Daten aus Tabelle "001" angezeigt bekommen jedoch mit den verständlichen Überschriftennamen (also "v03" wird ersetzt durch "Temperatur"
Kann mir da jemand einen Hinweis geben 😟
LG
Tobias
 
Werbung:
Dazu werden Aliasnamen verwendet, kleines Beispiel:

Code:
select 1 as zahl

das "as zahl" dient dazu, den Spaltennamen als zahl zu definieren.

EDIT:
Auf dich ein wenig zur verständlichkeit angepasst:
Code:
select v03 as 'Temperatur' from 001
 
Das ergibt so wenig bis gar keinen Sinn. Angenommen, im Feld "Name" steht in einer Zeile "Temperatur" und in der nächsten Zeile "Bullshit", welchen Namen soll dann bei einer Abfrage die Spalte haben, falls beide Zeilen anzuzeigen sind?

Ich versteh aber, was Du meinst: Du hast verschiedene Attribute wie z.B. 'Temperatur', 'Luftfeuchte' etc. und möchstest das passend angezeigt bekommen.

Scheinbar suchst Du etwas wie:

Code:
postgres=# create table t01 (id int);
CREATE TABLE
postgres=# create table t01_params(id int, name text);
CREATE TABLE
postgres=# insert into t01 values (3);
INSERT 0 1
postgres=# insert into t01 values (4);
INSERT 0 1
postgres=# insert into t01_params values (3, 'Temperatur');
INSERT 0 1
postgres=# insert into t01_params values (4, 'Luftfeuchte');
INSERT 0 1
postgres=# select t01.id, t01_params.name from t01 left join t01_params on t01.id=t01_params.id;
 id |    name     
----+-------------
  3 | Temperatur
  4 | Luftfeuchte
(2 rows)

postgres=#

Noch ein Hinweis: MySQL ist nicht anfängerfreundlich, und auch nicht nutzerfreundlich. Es hat eine lange Liste von Bugs, es liefert unverständliche Fehlermeldungen und es fehlen viele moderne Features. Es gibt bessere Alternativen, auch und gerade für Anfänger.
 
Dazu werden Aliasnamen verwendet, kleines Beispiel:

Code:
select 1 as zahl

das "as zahl" dient dazu, den Spaltennamen als zahl zu definieren.

EDIT:
Auf dich ein wenig zur verständlichkeit angepasst:
Code:
select v03 as 'Temperatur' from 001
Schon mal gut :) habe es gerade ausprobiert und die Überschrift ändert sich. Nun möchte ich aber nicht alle Überschriften manuell ändern, sondern aus der Tabelle 001_Params auslesen... 🤔 Jemand dazu eine Idee?
 
Das ergibt so wenig bis gar keinen Sinn. Angenommen, im Feld "Name" steht in einer Zeile "Temperatur" und in der nächsten Zeile "Bullshit", welchen Namen soll dann bei einer Abfrage die Spalte haben, falls beide Zeilen anzuzeigen sind?

Ich versteh aber, was Du meinst: Du hast verschiedene Attribute wie z.B. 'Temperatur', 'Luftfeuchte' etc. und möchstest das passend angezeigt bekommen.

Scheinbar suchst Du etwas wie:

Code:
postgres=# create table t01 (id int);
CREATE TABLE
postgres=# create table t01_params(id int, name text);
CREATE TABLE
postgres=# insert into t01 values (3);
INSERT 0 1
postgres=# insert into t01 values (4);
INSERT 0 1
postgres=# insert into t01_params values (3, 'Temperatur');
INSERT 0 1
postgres=# insert into t01_params values (4, 'Luftfeuchte');
INSERT 0 1
postgres=# select t01.id, t01_params.name from t01 left join t01_params on t01.id=t01_params.id;
 id |    name    
----+-------------
  3 | Temperatur
  4 | Luftfeuchte
(2 rows)

postgres=#

Noch ein Hinweis: MySQL ist nicht anfängerfreundlich, und auch nicht nutzerfreundlich. Es hat eine lange Liste von Bugs, es liefert unverständliche Fehlermeldungen und es fehlen viele moderne Features. Es gibt bessere Alternativen, auch und gerade für Anfänger.
Hmmm...
Tabelle 001_Params sieht aktuell so aus:
ID Name Byte Factor Unit Changeable
0 Temp_Ist 2 10 C 0
1 Temp_Ist_intern 2 10 C 0
2 Interval 2 1 s 1
3 max Temp 2 1 C 0
4 modus 0 1 1

Tabelle 001 so:
id writing_time v00 v01 v02 v03 v04
41 2023-01-09 16:38:26 209 291 60 300 1
40 2023-01-09 16:33:26 209 291 60 300 1
39 2023-01-09 16:28:26 209 290 60 300 1

Und ich hätte gerne eine Ausgabe:
id writing_time Temp_Ist Temp_Ist_intern Interval max Temp modus
41 2023-01-09 16:38:26 209 291 60 300 1
40 2023-01-09 16:33:26 209 291 60 300 1
39 2023-01-09 16:28:26 209 290 60 300 1
 
Hmmm...
Tabelle 001_Params sieht aktuell so aus:
ID Name Byte Factor Unit Changeable
0 Temp_Ist 2 10 C 0
1 Temp_Ist_intern 2 10 C 0
2 Interval 2 1 s 1
3 max Temp 2 1 C 0
4 modus 0 1 1

Tabelle 001 so:
id writing_time v00 v01 v02 v03 v04
41 2023-01-09 16:38:26 209 291 60 300 1
40 2023-01-09 16:33:26 209 291 60 300 1
39 2023-01-09 16:28:26 209 290 60 300 1

Und ich hätte gerne eine Ausgabe:
id writing_time Temp_Ist Temp_Ist_intern Interval max Temp modus
41 2023-01-09 16:38:26 209 291 60 300 1
40 2023-01-09 16:33:26 209 291 60 300 1
39 2023-01-09 16:28:26 209 290 60 300 1
Oh na klar - mühsam versucht zu formatieren und dann doch ein Brei geworden - sorry :-|
 
Das Problem ist, dass ich mehrere Tabellen habe, die automatisch erzeugt werden. Auch die Anzahl der Spalten ist in Wirklichkeit deutlich länger...
 
Versuche den vorigen Post zu editieren, was 15 Minuten lange nach absenden eines Posts möglich ist.

EDIT:
Wie verwendest du die Datenbank? Also Homepage, Programm oder sonstwo?

weil so wie du das möchtest könnte man es mittels einer schleife machen und einem zweiten select, was in meiner Meinung nach aber unnötig wäre, wenn die Datenbankstruktur sinnvoll wäre...

beklag dich mal bei dem Administrator deiner vorgegebenen Datenbank ^^
 
Ja, das ist alles ein Murks. Dein Tabellendesign skaliert nicht, wenn ein neuer Parameter dazukommt mußt Du es anpassen Du kannst in etwa sowas machen:

Code:
postgres=# select * from t1_params ;
 id | name  
----+-------
  1 | Temp
  2 | Druck
  3 | Farbe
(3 rows)

postgres=# select * from t1_values ;
 id | param | value 
----+-------+-------
  1 |     1 |    10
  2 |     2 |    20
  3 |     3 |    30
(3 rows)

postgres=# select sum(t1_values.value) filter (where t1_values.param = 1) as "Temp", sum(t1_values.value) filter (where t1_values.param = 2) as "Druck" from t1_values ;
 Temp | Druck 
------+-------
   10 |    20
(1 row)

postgres=#

Wenn jetzt neue Parameter kommen ist das nur eine weitere Zeile in der t1_params und eine Anpassung der Abfrage. Diese könnte man aus den Daten der t1_params sogar dynamisch erzeugen, inklusive der Spaltennamen.
 
Versuche den vorigen Post zu editieren, was 15 Minuten lange nach absenden eines Posts möglich ist.

EDIT:
Wie verwendest du die Datenbank? Also Homepage, Programm oder sonstwo?

weil so wie du das möchtest könnte man es mittels einer schleife machen und einem zweiten select, was in meiner Meinung nach aber unnötig wäre, wenn die Datenbankstruktur sinnvoll wäre...

beklag dich mal bei dem Administrator deiner vorgegebenen Datenbank ^^
Die Daten möchte ich dann im nächsten Schritt per Grafana verarbeiten.

Der Admin, bei dem ich mich beschweren muss, bin ich selbst 😅
Habe auch eine Idee, wie ich alles anpassen kann, dass es auch anders funktioniert.
Trotzdem interessiert mich natürlich eine potenzielle Lösung.

Kannst du grob skizzieren, wie du das mit der Schleife meinst?
Danke schon mal an alle für die guten Impulse!
 
Ja, das ist alles ein Murks. Dein Tabellendesign skaliert nicht, wenn ein neuer Parameter dazukommt mußt Du es anpassen Du kannst in etwa sowas machen:

Code:
postgres=# select * from t1_params ;
 id | name 
----+-------
  1 | Temp
  2 | Druck
  3 | Farbe
(3 rows)

postgres=# select * from t1_values ;
 id | param | value
----+-------+-------
  1 |     1 |    10
  2 |     2 |    20
  3 |     3 |    30
(3 rows)

postgres=# select sum(t1_values.value) filter (where t1_values.param = 1) as "Temp", sum(t1_values.value) filter (where t1_values.param = 2) as "Druck" from t1_values ;
 Temp | Druck
------+-------
   10 |    20
(1 row)

postgres=#

Wenn jetzt neue Parameter kommen ist das nur eine weitere Zeile in der t1_params und eine Anpassung der Abfrage. Diese könnte man aus den Daten der t1_params sogar dynamisch erzeugen, inklusive der Spaltennamen.
Welche DB sollte ich idealerweise verwenden? Du schreibst "postgres=#" - funktionieren die Befehle auch in meiner MariaDB? Der Nachbau deiner Syntax hat bei mir nicht hingehauen...
 
ich verwende PostgreSQL, und das 'postgres=#' ist der interaktive Prompt der Datenbank. Ich 'rede' mit ihr, indem ich dann die Befehle eingebe, diese mit ';' abschließe und <ENTER> drücke. Die DB 'redet' dann mit mir, indem sie meine Befehle ausführt und entsprechende Reaktionen ausgibt.
 
Werbung:
Zurück
Oben