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

Mehrfachabfragen mit mehren Bedingungen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Thrawn, 11 März 2013.

  1. Thrawn

    Thrawn Neuer Benutzer

    Hi zusammen,

    ich habe momentan einen recht mühsehligen Auftrag, der eventuell etwas einfacher zu handhaben wäre.
    Ich habe unter anderem folgende Spalten:

    dtStart -> DateTime -> Zeitstempel mit Datum und Uhrzeit des Eintrags
    nDuration -> Decimal -> Zeitdauer in Sekunden
    nID -> Int -> Kunden-ID

    Ich möchte Select-Abfragen tätigen, die in Zeiträumen die Anzahl und Dauer der Anrufe zusammenfasst

    Momentan sieht es noch so aus:


    Code:
    SELECT count(*) as Anzahl, sum(nDuration) as Dauer
    FROM tabelle
    WHERE dtStart BETWEEN 'JJJJMMTT SS:MM:SS:XXXX' AND 'JJJJMMTT SS:MM:SS:XXXX'
    AND nID=XXXX

    Da dort aber immer jeder Tag händisch eingetragen werden muss, dauert dies auf ein Jahr betrachtet furchtbar lange und ist stupide.

    • Gibt es eine Möglichkeit, die einzelnen Tage auf einen Zeitraum (Monat oder Jahr) komplett gleich ausgeben zu lassen?
    • Falls nein, gibt es einen Weg, die BETWEEN-Klausel auf Zeitstempel + 24h oder ähnlich einzugeben?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    In PG gibt es eine Funktion generate_Series(), mit dessen Hilfe könntest Du 'on-the-fly' eine Hilfstabelle erstellen:

    Code:
    test=*# select '2013-01-01'::date + s * '1day'::interval from generate_Series(0,10)s;
          ?column?
    ---------------------
     2013-01-01 00:00:00
     2013-01-02 00:00:00
     2013-01-03 00:00:00
     2013-01-04 00:00:00
     2013-01-05 00:00:00
     2013-01-06 00:00:00
     2013-01-07 00:00:00
     2013-01-08 00:00:00
     2013-01-09 00:00:00
     2013-01-10 00:00:00
     2013-01-11 00:00:00
    (11 rows)
    
    
    Vielleicht hat M$SQL ja was ähnliches im Angebot?


    Andreas
     
  3. ukulele

    ukulele Datenbank-Guru

    Du meinst in etwa so?:
    Code:
    SELECT    datepart(yyyy,dtStart) AS Jahr,
            datepart(mm,dtStart) AS Monat,
            datepart(dd,dtStart) AS Tag,
            count(*) AS Anzahl,
            sum(nDuration) AS Dauer
    FROM    tabelle
    WHERE    nID=XXXX
    GROUP BY datepart(yyyy,dtStart),datepart(mm,dtStart),datepart(dd,dtStart)
     
    Thrawn gefällt das.
  4. Thrawn

    Thrawn Neuer Benutzer

    Genial. Ukulele, du hast mir ca. 6 Stunden Arbeit erspart.

    Group By gehört zu den Sachen, die ich bisher gemieden habe.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Anzumerken ist aber noch, daß da keine Zeilen kommen für Tage, an denen keine Werte vorliegen. Ich ging davon aus, daß dies nötig sei.

    Andreas
     
  6. ukulele

    ukulele Datenbank-Guru

    Eine Funktion wie generate_series() ist mir unter MS SQL leider nicht bekannt. Daher werden auch Dinge wie 2-Tages Intervale ein bischen frickelig. Lösbar ist das schon nur eben nicht so komfortabel.
     
  7. Tommi

    Tommi Datenbank-Guru

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