SQL - Abfrage
-
Habe es jetzt schon in mehreren SQL-Foren probiert, aber da konnte mir nicht so richtig geholfen werden.
Deshalb poste ich mein Problem auch hier noch mal.habe eine einzige Tabelle mit folgendem Spalten:
id (PK) | meas_id | zone | moment | kind | value
und nun möchte ich für eine spezielle meas_id eine Ausgabetabelle in dieser Form(sortier nach moment (ASC)):
moment | value kind | value kind ... (für weitere zonen)
(alle Werte)|(für zone=1)|(für zone=2)Wenns ginge, würde ich auf Views verzichten.
Nochmal ein Beipiel, damit es so richtg klar wir:
(ausgangstabelle)<table border=1> <tr><td>id(PK)</td><td>meas_id</td><td>zone</td><td>moment</td><td>kind</td><td>value</td></tr> <tr><td>2</td><td>1</td><td>1</td><td>0</td><td>J</td><td>80</td></tr> <tr><td>1</td><td>1</td><td>1</td><td>30</td><td>R</td><td>200</td></tr><tr><td>3</td><td>1</td><td>1</td><td>100</td><td>R</td><td>350</td></tr> <tr><td>4</td><td>1</td><td>2</td><td>20</td><td>e</td><td>50</td></tr> <tr><td>5</td><td>1</td><td>2</td><td>60</td><td>J</td><td>300</td></tr> </table>
(ausgabetabelle für meas_id=1 (also alles ) )
<table border=1> <tr><td> </td><td colspan=2>Zone 1</td><td colspan=2>Zone 2</td></tr><tr><td>moment</td><td>value</td><td>kind</td><td>value</td><td>kind</td> </tr><tr><td>0</td><td>80</td><td>J</td><td> </td><td> </td></tr> <tr><td>20</td><td> </td><td> </td><td>50</td><td>e</td></tr> <tr><td>30</td><td>200</td><td>R</td><td> </td><td> </td></tr> <tr><td>60</td><td> </td><td> </td><td>300</td><td>J</td></tr><tr><td>100</td><td>350</td><td>R</td><td> </td><td> </td></tr> </table>
(bzw. noch mehr Zonen)
Was mit den leeren Feldern ist, weiss ich selber noch nicht so recht. Leer wäre mir wohl am liebsten, aber ob das geht??
Ich lege die Abfrage in ein Recordset und dann direkt in ein Datagrid.Zum praktischen Hintergrund: es geht um einen Ofen mit mehreren extra ansteuerbaren Zonen. moment sind sekunden und value ist die Temperatur, kind die Art des Überganges von einer Temperatur in die nächste.
Einen Vorschlag habe ich schon bekommen:
SELECT zone, moment, kind, value FROM Tabelle1 GROUP BY zone, moment, kind, value ORDER BY moment;
Für jemanden, der darin navigieren soll, wäre es so aber sehr unübersichtlich.
bei Fragen fragen
hoffe, mir kann da jemand helfenEdit:
den HTML-Tag habe ich wohl falsch verstanden, geht HTML hier garni?
Also noch mal anders:(ausgangstabelle)
id(PK) meas_id zone moment kind value 1 1 1 0 J 80 2 1 1 30 R 200 3 1 1 100 R 350 4 1 2 20 e 50 5 1 2 60 J 300
(ausgabetabelle für meas_id=1 (also alles )
Zone 1 Zone 2 Zone 3 .... moment value kind value kind 0 80 J 20 50 e 30 200 R 60 300 J 100 350 R
-
Hallo,
also ich muss sagen, dass ich fast gar nix verstanden habe. Ich versuche mal zusammenzufassen:
Du möchtest für bestimmte meas_id's verschiedene Ansichten darstellen. Ok. Aber das Problem an sich ist mir überhaupt nicht klar. Und deine Tabellen, auch die überarbeiteten unten, bringen nur wenig Licht, zumindest bei mir.geht HTML hier garni?
Doch, aber dann werden eben HTML Tags farbig angezeigt. Ansonsten ist HTML deaktiviert.
-
Ich muss sagen, ich hab's auch net kapiert. Aber ich glaube dein Problem scheint zu sein, dass du sachen, die in deiner Tabelle untereinander stehen nebeneinander haben willst. Falls Ja: Eine mögliche Lösung sind Subselects.
select moment, (select value from tabelle t2 where zone = 1 and t.id = t2.id) as value_zone_1, (select kind from tabelle t2 where zone = 1 and t.id = t2.id) as kine_zone_1, (select value from tabelle t2 where zone = 2 and t.id = t2.id) as value_zone_2, USW... from tabelle t
-
Hmm, ich weiss grad nicht wie ich es noch besser erklären soll. Vielleicht hilft der Hinweis das es hier darum geht eine angenehm anzusehende Ausgabetabelle zu erstellen.
Der Tip mit den Subselects war auf jeden Fall schon sehr hilfreich. Leider habe ich nur eine Ausgangstabelle und nicht 2 (@frenki: du hast da ja t und t2).
Dieser Code bringt mir die gewünschte Ausgabe:SELECT data2.moment, (SELECT value FROM data2 WHERE zone = 1 and data2.id=data3.id) AS value_1, (SELECT kind FROM data2 WHERE zone = 1 and data2.id=data3.id) AS kind_1, (SELECT value FROM data2 WHERE zone = 2 and data2.id=data3.id) AS value_2, (SELECT kind FROM data2 WHERE zone = 2 and data2.id=data3.id) AS kind_2 FROM data2,(select id from data2) AS data3 WHERE data2.meas_id=1 AND data2.id=data3.id ORDER BY data2.moment;
Allerdings erstell ich mir hier so eine Art Hilfstabelle (data3) und kann wahrscheinlich deshalb später im Datagrid nicht einfach rumändern ("Nicht genügend Basistabelleninformationen zum aktualisieren").
Kann ich die Hilfstabelle/Sicht irgendwie umgehen?
-
Nö, ich habe da nur eine Tabelle
t und t2 sind nur ein Alias für dieselbe Tabelle ("tabelle"). t für das äussere select, t2 für die Subselectes. Dient einfach nur dazu, dass man die ID des äusseren Selectes mit der ID des subselectes vergleichen kann (t.id = t2.id)
Ich bezfweilfe aber trotzdem, dass du in dem Resultset updaten kannst, auch wenn du mit einer Tabelle auskommst. Habe ich aber noch nie probiert...
-
Hast aber trotzdem recht :(.
Also muss ich jeden Zugriff manuell schreiben. Wie kann ich ausschalten, das der im Datagrid versucht die DB-Tabelle zu aktualisieren (es aber eh nicht schafft)?