Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Summe Betriebsstunden eines Jahres

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Horst-Erich, 12 März 2017.

  1. Horst-Erich

    Horst-Erich Benutzer

    Hallo,

    folgendes Problem:

    Die Tabelle Betriebsstunden enthält "Inventarnummer", "Datum" und "Stunden".
    Ich möchte die Gesamtstunden eines Jahres eines Standortes summiert haben.
    Mit: "SELECT MAX(Stunden) - MIN(Stunden) AS gesamt FROM Betriebsstunden
    WHERE Inventarnummer LIKE '201%' AND Datum BETWEEN @Date1 AND @Date2
    GROUP BY Inventarnummer"
    bekomme ich die einzelnen (korrekten) Werte pro Maschine pro Jahr. Wie kann ich diese nun noch
    in der Abfrage summieren? Meine Versuche enden alle mit diversen Fehlermeldungen...

    Würde mich über Vorschläge freuen!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    In Deinem Select fehlt in der Select-Liste offensichtlich noch die Inventarnummer.

    Zu Deiner Frage:

    "select sum(gesamt) from (hier dein bisheriges select) foo" liefert Dir das, was Du suchst.
     
  3. ukulele

    ukulele Datenbank-Guru

    Normalerweise würde ich sagen
    Code:
    SELECT datepart(yyyy,datum) AS jahr,sum(stunden) AS stunden
    FROM betriebsstunden
    GROUP BY datepart(yyyy,datum)
    Ich verstehe aber deinen Ansatz nicht, warum max(stunden - min(stunden)? Warum gruppierst du nach der Inventarnummer? Wie unterscheide ich Standorte?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    er speichert vermutlich immer den aktuellen Stand und muß daher die Differenz ermitteln, um für einen bestimmten Zeitraum (Jahr, $whatever) zu ermitteln, wie viele Stunden das Teil lief. Die Inventarnummer wiederum gibt ihm (vermutlich) einen Hinweis auf den Standort - falls er den braucht.
     
  5. Horst-Erich

    Horst-Erich Benutzer

    @ukulele: Deine Variante summiert mir im laufe des Jahres alle Zwischenablesungen auf, also keine wirklichen Laufzeiten der Maschine.

    @akretschmer : "SELECT SUM(gesamt) FROM (SELECT MAX(Stunden)-MIN(Stunden)) AS gesamt FROM Betriebsstunden WHERE Inventarnummer LIKE '201%' AND Datum BETWEEN '2016/01/01' AND '2016/12/31' "
    gibt eine Fehlermeldung. Falsche Klammersetzung?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ja. Du hast eine vergessen. Und auch den Table-Alias.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Nach privater Nachfrage / Bitte um Erklärung:

    Code:
    test=*# select * from horst_erich ;
     inv_nr |  datum  | stunden
    --------+------------+---------
      1 | 2016-02-02 |  2000
      1 | 2016-12-02 |  2100
      1 | 2017-01-01 |  2150
      1 | 2017-12-31 |  3150
      2 | 2016-02-02 |  20000
      2 | 2017-01-01 |  21000
      2 | 2017-10-31 |  23000
    (7 Zeilen)
    
    test=*# select inv_nr, max(stunden)-min(stunden) as laufzeit_2017 from horst_erich where datum between '2017-01-01' and '2017-12-31' group by inv_nr;
     inv_nr | laufzeit_2017
    --------+---------------
      1 |  1000
      2 |  2000
    (2 Zeilen)
    
    test=*# select sum(laufzeit_2017) as summe from (select inv_nr, max(stunden)-min(stunden) as laufzeit_2017 from horst_erich where datum between '2017-01-01' and '2017-12-31' group by inv_nr) bla;
     summe
    -------
      3000
    (1 Zeile)
    
    test=*#
    
    Nun klarer?
     
  8. Horst-Erich

    Horst-Erich Benutzer

    Ja, vielen Dank!
    Die korrekte Syntax der Abfrage habe ich hin bekommen.
    Das Problem liegt in der Abfrage selber. SUM(Max - MIN) von mehreren Maschinen eines Standortes liefert zum Beispiel SUM(Max(Maschine X)-MIN(Maschine Y). Macht aber keinen Sinn mit Werten von verschiedenen Maschinen zu rechnen.
    Muß mir also überlegen, in welcher Form die Werte abgespeichert werden. Ich wollte nur nicht ca. 30 Tabellen für jeden Standort anlegen. Andererseits muß ich wohl für jede Maschine eine eigene Abfrage erstellen, um korrekte Werte zu erhalten. Das richtige Datenmodell - learn more...! :)
     
  9. ukulele

    ukulele Datenbank-Guru

    Blos nicht eine Tabelle pro Maschine, das ist Quatsch.

    Du suchst
    Code:
    SELECT standort,maschine,max()-min()
    FROM tabelle
    WHERE ...
    GROUP BY standort,maschine
     
  10. akretschmer

    akretschmer Datenbank-Guru

    siehe meine Antwort in #2 ;-)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden