Neuling ersucht Hilfestellung bei Abfragen-Erstellung

Solivaguz

Neuer Benutzer
Beiträge
4
Guten Tag,
dies ist das erste Mal, dass ich mich extra in einem Forum anmelde um Hilfe zu bekommen. :)
Aber ich weiss einfach nicht weiter.

Ich habe die Grundlagen von SQL-Statements gelernt, bin nun aber mit meinem Latein am Ende.

Folgende Situation:
Ich lese 1-wire Temperatur-Sensoren aus und habe für jeden Sensor eine Tabelle angelegt.

Tabelle "Sensor 1"
TAG | MONAT | JAHR | UHRZEIT | MESSWERT
01 | 05 | 2012 | 14:33:53 | 17.55
01 | 05 | 2012 | 14:34:53 | 17.25


Tabelle "Sensor 2"
TAG | MONAT | JAHR | UHRZEIT | MESSWERT
01 | 05 | 2012 | 14:22:53 | 17.55
01 | 05 | 2012 | 14:34:53 | 18.25

und so weiter... ich hoffe, dass es klar wird.

Jetzt zu meinem Problem:
Ich versuche seit Tagen eine Abfrage zu erstellen, die mir alle Daten aller Sensoren in einer Art CSV ausgibt. Mit folgendem Format:

ABFRAGE "ALLE MESWERTE"
TAG | MONAT | JAHR | UHRZEIT | SENSOR 1 | SENSOR2
01 | 05 | 2012 | 14:22:53 | ------ | 17.55
01 | 05 | 2012 | 14:33:53 | 17.25 | -------
01 | 05 | 2012 | 14:34:53 | 17.25 | 18.25

Sodass alle Messwerte nach Datum sortiert in einer Tabelle sichtbar werden.
Diese Daten würde ich dann in eine CSV exportieren.


Ich habe mir schon sehr lange den Kopf darüber zerbrochen und mich mit JOIN uvm. beschäftigt, bekomme es aber einfach nicht hin..

Kann mir bitte jemand eine Hilfestellung oder eine Lösung geben?
Danke im Vorraus - Solivaguz
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
Normalerweise wäre das einfach, du nimmst eine Ausgangstabelle und "joinst" alle anderen Messwerte dazu.

Dein Problem könnte aber darin bestehen, das nicht für alle Tage und Zeiten Messdaten für alle Sensoren vorliegen. Man muss also davon ausgehen, das man keine Basistabelle hat auf die man die Messdaten aus den anderen Tabellen legen kann und das auch in diesen anderen Tabellen nicht zu jeder Zeit alle Messwerte zu finden sind.

Eigentlich gibt es dafür die Möglichkeit des Cross Joins, aber ich bin nicht sicher, wie sich der auf MySQL macht oder ob das nicht zuviel Performance kostet. Deshalb eine etwas umständlichere Lösung (könnte aber auch Probleme machen):
Code:
SELECT    DISTINCT
        Basistabelle.TAG,
        Basistabelle.MONAT,
        Basistabelle.JAHR,
        Basistabelle.UHRZEIT,
        t1.MESSWERT AS [Sensor 1],
        t2.MESSWERT AS [Sensor 2],
        t3.MESSWERT AS [Sensor 3],
        t4.MESSWERT AS [Sensor 4]
FROM    (    SELECT    DISTINCT *
            FROM    (    SELECT    TAG,
                                MONAT,
                                JAHR,
                                UHRZEIT
                        FROM    tabelle1
                        UNION ALL
                        SELECT    TAG,
                                MONAT,
                                JAHR,
                                UHRZEIT
                        FROM    tabelle2
                        UNION ALL
                        SELECT    TAG,
                                MONAT,
                                JAHR,
                                UHRZEIT
                        FROM    tabelle3
                        UNION ALL
                        SELECT    TAG,
                                MONAT,
                                JAHR,
                                UHRZEIT
                        FROM    tabelle4
                    ) Basis
        ) Basistabelle
LEFT JOIN tabelle1 t1
ON        t1.TAG = Basistabelle.TAG
AND        t1.MONAT = Basistabelle.MONAT
AND        t1.JAHR = Basistabelle.JAHR
AND        t1.UHRZEIT = Basistabelle.UHRZEIT
LEFT JOIN tabelle1 t2
ON        t2.TAG = Basistabelle.TAG
AND        t2.MONAT = Basistabelle.MONAT
AND        t2.JAHR = Basistabelle.JAHR
AND        t2.UHRZEIT = Basistabelle.UHRZEIT
LEFT JOIN tabelle1 t3
ON        t3.TAG = Basistabelle.TAG
AND        t3.MONAT = Basistabelle.MONAT
AND        t3.JAHR = Basistabelle.JAHR
AND        t3.UHRZEIT = Basistabelle.UHRZEIT
LEFT JOIN tabelle1 t4
ON        t4.TAG = Basistabelle.TAG
AND        t4.MONAT = Basistabelle.MONAT
AND        t4.JAHR = Basistabelle.JAHR
AND        t4.UHRZEIT = Basistabelle.UHRZEIT

Die Basistabelle beinhaltet alle möglichen Zeiten jeweils einmal. per Left Join wird dann der jeweilige Messwert angefügt, wenn vorhanden.
 

Solivaguz

Neuer Benutzer
Beiträge
4
Das mit der Basistabelle hatte ich mir auch schon überlegt.
Habe mir eine angelegt und wie du sagst mit JOINS herumexperimentiert... Habe es aber nicht hinbekommen.

Das, was du da gepostet hast, sieht ganz nützlich und sinnvoll aus.

Ich werde mir das morgen mal in Ruhe durchlesen und nachvollziehen.

Ich melde mich dann..

Schonmal ein großes DANKE!
 

Solivaguz

Neuer Benutzer
Beiträge
4
Hallo,

ich bin gerade am Testen.
Code:
FROM    (    SELECT    DISTINCT *
            FROM    (    SELECT    TAG,
                                MONAT,
                                JAHR,
                                UHRZEIT
                        FROM    tabelle1
                        UNION ALL
                        SELECT    TAG,
                                MONAT,
                                JAHR,
                                UHRZEIT
                        FROM    tabelle2
                        UNION ALL
                        SELECT    TAG,
                                MONAT,
                                JAHR,
                                UHRZEIT
                        FROM    tabelle3
                        UNION ALL
                        SELECT    TAG,
                                MONAT,
                                JAHR,
                                UHRZEIT
                        FROM    tabelle4
                    ) Basis
        ) Basistabelle

Wofür steht das Basis? Sollte eigentlich auch Basistabelle heißen, oder?

Mein SQL meckert über Zeile 7 ...
Ich probiere mal weiter rum.

Mein angepasster Code bis jetzt:
Code:
SELECT    DISTINCT
        Basistabelle.tag,
        Basistabelle.monat,
        Basistabelle.jahr,
        Basistabelle.zeit,
        10A374C6000800CA.messwert
        10932BC6000800DD.messwert
FROM    (    SELECT    DISTINCT *
            FROM    (    SELECT    tag,
                                monat,
                                jahr,
                                zeit
                        FROM    10A374C6000800CA
                        UNION ALL
                        SELECT    tag,
                                monat,
                                jahr,
                                zeit
                        FROM    10932BC6000800DD
                    ) Basistabelle
        ) Basistabelle
LEFT JOIN 10A374C6000800CA
ON        10A374C6000800CA.tag = Basistabelle.tag
AND        10A374C6000800CA.monat = Basistabelle.monat
AND        10A374C6000800CA.jahr = Basistabelle.jahr
AND        10A374C6000800CA.zeit = Basistabelle.zeit
LEFT JOIN 10932BC6000800DD
ON        10932BC6000800DD.tag = Basistabelle.tag
AND        10932BC6000800DD.monat = Basistabelle.monat
AND        10932BC6000800DD.jahr = Basistabelle.jahr
AND        10932BC6000800DD.zeit = Basistabelle.zeit
 

Solivaguz

Neuer Benutzer
Beiträge
4
NACHTRAG (sry für Doppelpost)

Es scheint zu klappen!!!
Ich danke dir vielmals!

Falls ich noch Probleme habe, melde ich mich noch einmal.
Vielen Dank!

Fertige Abfrage:
Code:
SELECT  DISTINCT
        Basistabelle.tag,
        Basistabelle.monat,
        Basistabelle.jahr,
        Basistabelle.zeit,
        10A374C6000800CA.messung,
        10932BC6000800DD.messung
FROM    (
        SELECT    DISTINCT *
                FROM    (
                        SELECT          tag,
                                        monat,
                                        jahr,
                                        zeit
                        FROM    10A374C6000800CA
                        UNION ALL
                        SELECT          tag,
                                        monat,
                                        jahr,
                                        zeit
                        FROM    10932BC6000800DD
                        ) Basistabelle
        ) Basistabelle
LEFT JOIN 10A374C6000800CA
ON        10A374C6000800CA.tag = Basistabelle.tag
AND        10A374C6000800CA.monat = Basistabelle.monat
AND        10A374C6000800CA.jahr = Basistabelle.jahr
AND        10A374C6000800CA.zeit = Basistabelle.zeit
LEFT JOIN 10932BC6000800DD
ON        10932BC6000800DD.tag = Basistabelle.tag
AND        10932BC6000800DD.monat = Basistabelle.monat
AND        10932BC6000800DD.jahr = Basistabelle.jahr
AND        10932BC6000800DD.zeit = Basistabelle.zeit
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
Das Basis ist ein Alias für die Unterabfrage in den Klammern. Ich wollte eigentlich nicht 2x den selben Alias verwenden, aber scheint ja auch zu gehen.
 
Oben