Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Abfrag - weiss nicht ob es geht..

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SQL Abfrag - weiss nicht ob es geht..

    Hi Community,

    ich habe eine Tabelle:

    Date, Werk, Status

    Darin speicher ich pro Werk jede Minute ein Ergebnis ab Status = ok oder Offline

    Jetzt möchte ich eine Abfrage die mir folgendes Ergebnis liefert:

    Date Werk Status Werk Status Werk Status
    2010-07-19 08:10 xyz OK asb Offline kjlkj OK

    Wie bekomme ich das hin? Mit Inner Join geht es ja nicht, weil es sich hierbei ja nur um eine Tabelle handelt.

    Danke für eure Tipps.

    Gruß,
    Daniel

  • #2
    Also wenn in "Werk" alles mögliche drinstehen kann, dann ist das was du willst unmöglich. Gibt es fest definierte Werte, dann wäre es zwar möglich aber erstens aufwending und zweitens nicht empfehlenswert. Was hast du denn vor? Kannst du vielleicht ein paar mehr Hintergrundinfos geben?

    Kommentar


    • #3
      Also wir haben in unserer Firma im Moment Probleme mit unseren VPN Verbindungen. Habe zu mehreren Standorten Weltweit eine Standverbindung via VPN. Doch seit den letzten Tagen brechen diese sporadisch mehrmals täglich ab.

      Jetzt habe ich ein VB Programm geschrieben das im minutenintervall die einzelnen Subnetze in den Aussenstellen anping. Kommt der Ping nicht durch gibt es ein PopUp "VPN Ausfall". Parrallel dazu protokolle ich die Meldungen "ok" oder "Offline" in eine SQL Datenbank um die Ausfälle und deren Ausfalldauer festhalten zu können um eventuell ein Schema oder Algorythmen festhalten und erkennen zu können.

      Ablauf:

      1 x Textdatei in der A) die IP steht die angepingt werden soll und B) Der Werkname

      1 x VB Programm das in die Textdatei geht die IPs anpingt und das Ergebnis in...

      1 x SQL Datenbank abspeichert die folgenden Aufbau hat:

      1 x Tabelle mit Spalten:
      Date (Zeitpunkt wann der Ping ausgeführt wurde)
      Werk (Welches Werk wurde angeping)
      Status (War der Ping OK oder nicht OK)

      Beispiel:

      Date Werk Status
      2010-07-19 08:00 A ok
      2010-07-19 08:00 B ok
      2010-07-19 08:00 C ok
      2010-07-19 08:01 A ok
      2010-07-19 08:01 B ok
      2010-07-19 08:01 C ok
      2010-07-19 08:02 A ok
      2010-07-19 08:02 B OFFLINE
      2010-07-19 08:02 C ok


      JETZT möchte ich aus diesen Daten eine "Zusammenfassung nach Zeit":

      Date Werk Status Werk Status Werk Status
      2010-07-19 08:00 A OK B OK C OK
      2010-07-19 08:01 A OK B OK C OK
      2010-07-19 08:02 A OK B OFFLINE C OK
      .
      .
      .

      Kommentar


      • #4
        Nach Zeit grupieren, Werte mit GROUP_CONCAT hintereinanderhängen ...?
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          @Chris: wie willst du denn da eine solche Ausgabe bekommen?

          Kommentar


          • #6
            INNER JOIN ist schon der richtige Ansatz wenn man das unbedingt über SQL und diese Tabellenstruktur abfrühstücken will.

            Irgendwie so (ungetestet) sollte es gehen:

            Code:
            SELECT
            	a.date,
            	a.status as aStatus,
            	b.status as bStatus,
            	c.status as cStatus
            FROM
            	tabelle a
            JOIN
            	tabelle b
            ON
            	a.date = b.date AND b.werk = 'B'
            JOIN
            	tabelle c
            ON
            	a.date = c.date AND c.werk = 'C'
            WHERE
            	a.werk = 'A'
            [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

            Kommentar


            • #7
              Folgende Lösung wäre mir eingefallen, wobei die drei Werke fest abgefragt werden. Gibt es weitere Werke muss jeweils ein weiterer SUB-Select dazukommen.

              Code:
              CREATE TABLE werkstatus (
               datum TIMESTAMP NOT NULL,
               werk VARCHAR(5) NOT NULL,
               status VARCHAR(10) NOT NULL
              );
              
              INSERT INTO werkstatus 
              ( datum, werk, status ) VALUE 
              ('2010-07-19 08:00','A','ok'),
              ('2010-07-19 08:00','B','ok'),
              ('2010-07-19 08:00','C','ok'),
              ('2010-07-19 08:01','A','ok'),
              ('2010-07-19 08:01','B','ok'),
              ('2010-07-19 08:01','C','ok'),
              ('2010-07-19 08:02','A','ok'),
              ('2010-07-19 08:02','B','OFFLINE'),
              ('2010-07-19 08:02','C','ok');
              
              SELECT d.datum, werk_a.werk, werk_a.status, werk_b.werk, werk_b.status, werk_c.werk, werk_c.status
                FROM ( SELECT datum FROM werkstatus
                        GROUP BY datum 
                     ) d
                JOIN ( SELECT datum , werk, status FROM werkstatus
                        WHERE werk = 'A' 
                     ) werk_a
                  ON werk_a.datum = d.datum
                JOIN ( SELECT datum , werk, status FROM werkstatus
                        WHERE werk = 'B' 
                     ) werk_b
                  ON werk_b.datum = d.datum
                JOIN ( SELECT datum , werk, status FROM werkstatus
                        WHERE werk = 'C' 
                     ) werk_c
                  ON werk_c.datum = d.datum 
              ORDER BY d.datum;
              
              +---------------------+------+--------+------+---------+------+--------+
              | datum               | werk | status | werk | status  | werk | status |
              +---------------------+------+--------+------+---------+------+--------+
              | 2010-07-19 08:00:00 | A    | ok     | B    | ok      | C    | ok     |
              | 2010-07-19 08:01:00 | A    | ok     | B    | ok      | C    | ok     |
              | 2010-07-19 08:02:00 | A    | ok     | B    | OFFLINE | C    | ok     |
              +---------------------+------+--------+------+---------+------+--------+
              3 rows in set (0.02 sec)
              
              mysql>
              Die Lösung ist nicht sehr flexibel, aber vielleicht reicht es so.

              Grüße
              Thomas

              Kommentar


              • #8
                Zitat von cycap Beitrag anzeigen
                @Chris: wie willst du denn da eine solche Ausgabe bekommen?
                So ...?
                Code:
                SELECT
                  datum,
                  GROUP_CONCAT( werk, ' ', status
                                ORDER BY werk, status
                                SEPARATOR ' ' ) 
                FROM `werkstatus` 
                GROUP BY datum
                [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                Kommentar


                • #9
                  Eigentlich wäre das doch eher ein Master-Detail Report, wobei Master (Zeit) und Detail (Werke und Status) aus der gleichen Tabelle kommen. Bist du denn darauf festgelegt, dass die Ausgabe genau so erfolgen muss? Ergebnismengen mit variabler Feldanzahl sind ja doch eher unüblich.

                  Kommentar

                  Lädt...
                  X