Announcement

Collapse
No announcement yet.

Zählen bestimmter Zeilen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zählen bestimmter Zeilen

    Hallo,

    ich habe folgendes Problem in einer Datenbanktabelle stehen die Ergebnisse von Prüfungen.
    Die Tabelle ist folgendermaßen aufgebaut:

    Lfd_Nr, Seriennummer, Status, Auftragsnummer, Station, Benutzer, Start_Zeit

    Ich möchte nun für jede Station die letzten 100 Prüfungen (des letzten Auftrages) erhalten und sie folgendermaßen abbilden:

    Station, Auftragsnummer, Seriennummer, Passed, Failed

    Bei 10 Stationen möchte ich 10 Zeilen erhalten.

    Mein Code sieht bis jetzt so aus:

    Code:
    SELECT r3.Station, r3.Auftragsnummer, r3.Seriennummer, Passed, Failed, r3.Start_Zeit from 
        (SELECT Auftragsnummer, Sum(case when Status= 'Passed' then 1 else 0 end) as Passed 
            FROM Test_Ergebnisse
            WHERE Start_Zeit > DATEADD(month, -3, GETDATE()) 
            GROUP BY Auftragsnummer) r1, 
        (SELECT Auftragsnummer, Sum(case when Status='Failed' then 1 else 0 end) as Failed 
            FROM Test_Ergebnisse
                        WHERE Start_Zeit > DATEADD(month, -3, GETDATE()) 
            GROUP BY Auftragsnummer) r2,
                     (SELECT T.Station, T.Auftragsnummer, T.Seriennummer, T.Start_Zeit
                                     FROM Test_Ergebnisse As T INNER JOIN
                         (SELECT B.Station, Max(B.Lfd_Nr) As [Lfd_Nr]
                                       FROM Test_Ergebnisse As B
                                                  WHERE Start_Zeit > DATEADD(month, -3, GETDATE())
                                      GROUP BY B.Station) As C
                                     ON T.Station= C.Station And T.Lfd_Nr = C.[Lfd_Nr]) r3
    WHERE r3.Auftragsnummer=r2.Auftragsnummer and r3.Auftragsnummer=r1.Auftragsnummer and (Passed!='0' or Failed!='0')
    ORDER BY r3.Station
    Wenn ich diesen anwende erhalte ich aber alle Ergebnisse für Passed / Failed und nicht nur die letzten 100. Noch mal zur Verdeutlichung es geht um die letzen 100 Prüfungen (z.B. 77 Passed / 33 Failed =100).

    Ich hoffe jemand kann mir helfen.

    Gruß

    Schwede

  • #2
    ab SQL-Server 2005 gibt es ROW_NUMBER () OVER (ORDER BY ....)
    so lautet mein Versuch
    [HIGHLIGHT="SQL"]SELECT te.Station
    , te.Auftragsnummer
    , te.Seriennummer
    , te.Start_Zeit
    , Sum(case when Status= 'Passed' then 1 else 0 end) AS Passed
    , Sum(case when Status= 'Failed' then 1 else 0 end) AS Failed
    FROM Test_Ergebnisse AS TE
    JOIN ( SELECT ROW_NUMBER () OVER (PARTITION BY te.Station
    , te.Auftragsnummer
    , te.Seriennummer
    ORDER BY te.Start_Zeit DESC ) AS NUM
    , te.Auftragsnummer
    FROM Test_Ergebnisse AS te
    WHERE Start_Zeit > DATEADD(MONTH, -3, GETDATE())
    ) AS teNum ON teNum.Auftragsnummer = te.Auftragsnummer
    AND teNum.Num <= 100
    WHERE Start_Zeit > DATEADD(MONTH, -3, GETDATE())
    GROUP BY te.Station
    , te.Auftragsnummer
    , te.Seriennummer
    , te.Start_Zeit
    ORDER BY te.Station[/HIGHLIGHT]

    und zum Anderen: Formatierung von SQL in Beiträgen
    Zuletzt editiert von ebis; 01.03.2011, 15:51. Reason: Aggregat

    Comment


    • #3
      Hallo,

      danke für die schnelle Antwort. Auf SQL 2000 erhalte ich folgende Fehlermeldung:

      Funktion ROW_NUMBER nicht verfügbar.

      und auf SQL 2008 folgende:

      Der mehrteilige Bezeichner 'r3.Station' konnte nicht gebunden werden.

      Sorry wegen der Formatierung.

      Was kann ich noch tuen?

      Gruß Schwede

      Comment


      • #4
        Originally posted by Schwede View Post
        Hallo,

        danke für die schnelle Antwort. Auf SQL 2000 erhalte ich folgende Fehlermeldung:

        Funktion ROW_NUMBER nicht verfügbar.
        Geht ja auch erst ab 2005...

        Originally posted by Schwede View Post
        und auf SQL 2008 folgende:

        Der mehrteilige Bezeichner 'r3.Station' konnte nicht gebunden werden.

        Sorry wegen der Formatierung.

        Was kann ich noch tuen?

        Gruß Schwede
        Copy Paste Fehler meinerseits
        da ich keine Alias r3 benutze nimm mal te

        Comment


        • #5
          Hallo,

          jetzt gibt es keinen Fehler aber die Funktion scheint zu mächtig zu sein. Ich bekomme einen Timeout. Gibt es noch die möglich dies etwas zu entschärfen?

          Danke

          Schwede

          Comment


          • #6
            Timeout im SSMS???

            Mal nur das innere SELECT Ausprobieren...

            Abfrage weiter einschränken...

            Ausführungsplan anzeigen, auswerten und evtl. fehlende Indexe erstellen...

            und so weiter

            Comment


            • #7
              Hallo,

              ich habe jetzt einen anderen Databasebrowser genommen.
              Der Code gibt mir aber nicht das raus was ich möchte:

              Station Auftragsnummer Seriennummer Passed Failed
              Test1 12345 1234 77 33
              Test2 54321 4321 99 1
              ...

              Stattdessen wird pro Auftargsnummer und Seriennummer eine Zeile rausgegeben und numeriert.

              Wenn ich diesen Code:

              [highlight=sql]SELECT T.Station, T.Auftragsnummer, T.Seriennummer, T.Start_Zeit
              FROM Test_Ergebnisse As T INNER JOIN

              (SELECT B.Station, Max(B.Lfd_Nr) As [Lfd_Nr]
              FROM Test_Ergebnisse As B
              WHERE Start_Zeit > DATEADD(month, -3, GETDATE())
              GROUP BY B.Station) As C

              ON T.Station= C.Station And
              T.Lfd_Nr = C.[Lfd_Nr];[/highlight]

              eingebe, erhalte ich für jede Station die letzte Auftragsnummer, Seriennummer, Start_Zeit. Wie kann ich diese Tabelle nutzen um an die Passed und Failed Werte der letzten 100 Prüfungen zu gelangen und dann wie oben dargestellt auszugeben?

              Gruß

              Schwede

              Comment

              Working...
              X