Forum: PC-Programmierung SQL Zeilen als Spalten ausgeben


von Frank (Gast)


Lesenswert?

Hi Leute,

ich sollte eine Datenbank (Messwerte verschiedener Sensoren) mit
folgender Struktur:


Zeit | SensorNo | Wert
Beispiele für Daten:
12:00|        1 | 22.4
12:00|        2 |  2.4
12:00|        3 |  0.6
12:01|        1 | 21.4
12:01|        2 |  2.3
12:01|        3 |  0.5
12:02|        1 | 20.4
12:02|        2 |  2.2
12:02|        3 |  0.4

umwandeln in eine Tabelle (Text-Datei) mit folgender Struktur
Zeit  | Sensor 1 | Sensor 2 | Sensor 3
12:00 |     22.4 |      2.4 |      0.6
12:01 |     21.4 |      2.3 |      0.5
12:02 |     20.4 |      2.4 |      0.4

Wie man sieht werden 3 Werte je Messzeitpunkt erfasst, die dann
nebeneinender stehen sollten.

Ist es irgendwie möglich das per SQL zu erledigen.
Problem ist, daß es sich um große Datenmengen handelt und folglich die
Funktion
möglichst schnell sein sollte.

Denkbar wäre als Hilfe auch eine Zweite Tabelle, in der ich zusätzlich
nur die Erfassungszeitpunkte gespeichert werden.

Hat jemand eine Idee ?

   Gruß
      Frank

von Jens Hartmann (Gast)


Lesenswert?

Versuch mal folgendes:

SELECT a.Zeit AS Zeit,a.Wert AS Sensor1,b.Wert AS Sensor2,c.Wert AS
Sensor3 FROM Tabelle a, Tabelle b, Tabelle c
WHERE a.Zeit = b.Zeit AND a.Zeit = c.Zeit.

Hope it helps

von Frank (Gast)


Lesenswert?

Hallo Jens,

kapiere ich nicht, bin auch nicht gerade Mister SQL.
Kannst du mir erläutern, was da genau dabei passiert ?

Gruß
    Frank

von Frank (Gast)


Lesenswert?

Ich noch mal,

die Werte der verschienenen Sensoren je Messzeitpunkt sollen nicht in
die Spalten einer bereits bestehenden Tabelle übernommen werden.
Das Problem ist, dass sich die Anzahl der Sensoren varibel ist und
deshalb eine Ausgabe-Tabelle (evt. Virtuelle Tabelle o.ä. wenn es so
was gibt) mit passender Spaltenzahl erst generiert werden muss.
Die Anzahl Sensoren kann zwischen 1 und 200 liegen (meist ca.15).
Deshalb wäre es wahrscheinlich ein Zeitfresser, ständig mit einer
Tabelle zu hantieren, bei der nur ein paar Prozent der Spalten wirklich
benutzt werden.

   Gruß
      Frank

von ... (Gast)


Lesenswert?

0. welches Datenbanksystem wird verwendet?

1. kommen alle Messwerte im  gleichen Datagramm?
2. 200 Joins gegen die "Zeitachse" verbruzzeln auch viel Zeit - dann
leiber 200 Spalten ;-)
3. Wieviele Messwerte sollen denn gespeichert werden - einer je
Minute?

ja - ich hantiere jeden Tag mit SQL

Richtiger und Besser
- wenn oben nur einer der Werte fehlt fällt die ganze Zeile aus -
besser Zeitchse bilden, Outer-Join verwende und über Index auf Zeit
und Sensor nachdenken


SELECT
 z.Zeit ,
 a.Wert AS Sensor1,
 b.Wert AS Sensor2,
 c.Wert AS
Sensor3 FROM ( select distinct zeit from tabelle ) z , Tabelle a,
Tabelle b, Tabelle c
WHERE 1=1
/*Join*/
and z.Zeit = a.Zeit (+)
and z.Zeit = b.zeit (+)
and z.Zeit = c.zeit (+)
/*Filter*/
and a.sensor = 1
and b.sensor = 2
and c.sensor = 3

von Frank (Gast)


Lesenswert?

>> 0. welches Datenbanksystem wird verwendet?
Habe zuerst paradox verwendet, bin jetzt aber auf MySQL
>> 1. kommen alle Messwerte im  gleichen Datagramm?
Ja, si kommen alle in der einen Tabelle und unterscheiden sich durch
die SensorNo
>> 3. Wieviele Messwerte sollen denn gespeichert werden - einer je
>> Minute?
Das ist nicht genau definiert und muss den Anforderungen jeweils
angepasst werden (1Minute - 1 Stunde). Es laufen allerdings Sensoren
verschiedener Messpunkte mit jeweils bis zu 200 Sensoren ein.
Es wäre also noch eine Spalte "MessPunktNo"  (neben Zeit | SensorNo |
Wert) vorhanden, was allerdings für das Problem hier nicht relevant ist.
Zudem werden die Daten über Jahre hinweg gespeichert.
Es wird also schon eine kleine Menge Daten.

>>ja - ich hantiere jeden Tag mit SQL
ich leider leider nicht.

Habe noch mal nachgekoogelt :-) - Wäre da nicht ein VIEW das geeignete
Instrument ?

Gruß
    Frank

von ... (Gast)


Lesenswert?

0.MYSQL - bin Oraclefixiert - würde mal Postgres versuchen...

1. Datagramm - meinte nicht Tabelle sondern  sind es 200 einzelinserts
oder ein Insert für 200 Meßwerte ... da macht auch manchmal einen
Unterschied aus

View - nein nicht unbedingt besser - zum Zusammenwurschteln schon aber
wie lang kann auf das Ergebniss gewartet werden  ....

wie arbeite ne View:

- besorgen alles Daten (by mySQL wird eventuelle dann die Datentabelle
200mal gelesen - jeweils gefiltert)
- joinen der Daten
- wegschmeißen der nicht benötigten Daten falls nur ein Tag gebraucht
wird...

Aber das kanst DU doch gut prübieren - kannst doch einfach mal die
Tabelle Testweise befüllen...


P.S. sollte nicht auch Tag, Monat u. Jahr  mit gespeichert werden ;-)

von Frank (Gast)


Lesenswert?

>> 0.MYSQL - bin Oraclefixiert - würde mal Postgres versuchen...
OK werde ich anschauen - Null Ahnung von Postgres also wirds etwas
dauern.

>> 1. Datagramm - meinte nicht Tabelle sondern  sind es 200
>> einzelinserts oder ein Insert für 200 Meßwerte ... da macht auch
>> manchmal einen Unterschied aus
Ein Insert erledigt alle Sensorwerte eines Messpunkts.

>> View - nein nicht unbedingt besser - zum Zusammenwurschteln schon
>> aber wie lang kann auf das Ergebniss gewartet werden  ....
Es soll eben so fix wie möglich sein (Web-Interface).

>> P.S. sollte P.S. sollte nicht auch Tag, Monat u. Jahr  mit
>> gespeichert werden ;-)
JoJo, das ist natürlich alles und noch mehr mit drin. Es sollte ja nur
ein Beispiel zur Veranschaulichung sein.

von Thomas L. (tom)


Lesenswert?

Um wieviel Messpunkte handelt es sich denn und in welchen Abständen soll
aktualisiert werden?

Wenns ein Web-Interface sein soll, könntest du doch beispielsweise
ASP.NET verwenden.

Ansatz: Die Webanwendung holt sich von Zeit zu Zeit die Daten aus der
DB (von mir aus alle paar Sekunden - kommt eben auf die Anzahl drauf
an). Sie wirft diese Daten nun in ein normales Array und du bist
eigentlich fertig.
Du kannst ja über die einzelnen Indizes umgekehrt auf das Array
zugreifen. Du vertauscht dafür einfach den Spalten mit dem Zeilenindex
und gut ists. Basierend auf diesen Daten, könnte die Anwendung noch
eine Grafik generieren und dieses ganze Zeugs dann ausgeben.

Wäre imho nicht allzu schwer zu lösen.

Spalten/Zeilen vertauschen bei mySQL stelle ich mir recht aufwendig
vor.

Grüße aus Wien

Tom

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.