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

SQL Berechnung

Dieses Thema im Forum "Microsoft Access" wurde erstellt von 5abi1, 22 Mai 2018.

  1. 5abi1

    5abi1 Benutzer

    Liebe Mitglieder,

    hallo erstmal - vorab ich bin wirklich ein extremer Anfänger in Sachen SQL und gebe mein Bestest um langsam wieder reinzukommen.

    Ich habe folgendes "Problem". In meiner Access Datenbank habe ich Daten mit folgenden Feldern: StartDatum, EndDatum, Priorität. Die Priorität besteht aus Niedrig, Mittel, Hoch. Das Start und EndDatum sind ein Timestamp. Jeden Tag kommen in die obengenannte Tabelle Datensätze hinzu. Wenn ein Problem gelöst wird, dann wird ein Enddatum gesetzt, ansonsten bleibt es leer.

    Nun möchte ich ein SQL schreiben, welches folgendes ausgibt - am besten in einer neuen Tabelle.

    Ab dem 1.1.2018 möchte ich nun schauen wie viele Probleme noch offen sind. Sprich durch das Start und EndDatum kann ich berechnen wie viele Tickets offen sind. Ich will eine Tabelle mit folgendem Inhalt.

    1.1.2018 | Offene Tickets | Priorität - also damit ich weiss am 1.1.2018 waren sagen wir mal 10 Tickets offen mit der Prirität Niedrig, 12 Ticket mit der Priorität Hoch und 0 Tickets mit der Prioität Mittel. Am 2.1.2018 waren sagen wir mal 5 Tickets offen mit der Prorität Niedrig, 7 Ticket mit der Priorität Hoch und 8 Tickets mit der Prioität Mittel und das ganze bis eben dem aktuellen Datum.

    Ich habe leider genau 0 Ahnung wie und wo ich damit ansetzen soll. Ich würde mich über jede Hilfe freuen. :)

    Liebe Grüße,
    5abi.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Also, Du hast solch eine Tabelle:

    Code:
    test=*# create table tasks (start date, ende date, prio text);
    CREATE TABLE
    
    Wenn was fertig ist, wird ende gesetzt, Dich interessiert je Tag nun die offenen Tasks, und zwar gruppiert nach der prio:

    Code:
    test=*# select current_date as datum, prio, count(1) from tasks where ende is null group by datum, prio;
     datum | prio | count
    -------+------+-------
    (0 Zeilen)
    
    Das machst Du dann einmal am Tag.


    Oder willst Du das im Nachgang berechnen?
     
  3. 5abi1

    5abi1 Benutzer

    Ja genau .. nur das ich immer einen Snapshot am Tag erhalte .. sprich wenn die am Tag offen bleiben, dann bleiben sie auch immer offen .. Sprich wenn am 1.1.2018 12 offen waren, dann bleiben die offen und es wird nicht mehr auf Ende gesetzt.

    Ja genau also im Nachgang. Weil aktuell habe ich Daten seit dem 1.1.2018 bis heute und ich bekommen täglich die Probleme vom Vortag. :)
     
  4. akretschmer

    akretschmer Datenbank-Guru

    das wird etwas schwerer, du brauchst z.B. eine "Hilfstabelle", die alle Datumswerte enthält, dagegen JOINt man dann und berechnet das. Ich würde das, in PostgreSQL, mit generate_series() machen, und auch statt 2 Felder start und ende gleich eine DATERANGE oder TSRANGE verwenden.

    Es kommt bestimmt jemand rum, der auch Access hat, und Dir hilft. Ich könnte, wie gesagt, das in PostgreSQL machen, aber von dessen Features ist Access vermutlich etliche Lichtjahre entfernt - das würde Dir also wenig helfen.
     
  5. 5abi1

    5abi1 Benutzer

    Naja vielleicht verstehst du mich gerade etwas falsch. Also aktuell sieht meine Tabelle folgendermaßen aus. Für jeden Tag habe ich folgende Informationen.
    ID | StartDatum | EndDatum | Prio
    P12834 | 01.01.2017 17:30:32 | 01.01.2017 17:50:32 | Hoch
    P12835 | 01.01.2017 14:10:32 | 01.01.2017 15:50:32 | Hoch
    P12836 | 02.01.2017 12:20:32 | 02.01.2017 19:50:32 | Nieder
    P12837 | 02.01.2017 11:50:42 | 02.01.2017 13:40:35 | Hoch
    P12838 | 02.01.2017 17:01:32 | - | Mittel
    P12839 | 03.01.2017 09:40:22 | - | Mittel

    So geht das eben bis zum 22.05.

    Jetzt will ich im Nachhinein ein SQL, welches mir folgendes sozusagen ausgibt:

    Datum | Offene Tickets | Priorität
    01.01.2017 | 0 | Hoch
    01.01.2017 | 0 | Niedrig
    01.01.2017 | 0 | Mittel
    02.01.2017 | 0 | Hoch
    02.01.2017 | 0 | Niedrig
    02.01.2017 | 1 | Mittel
    03.01.2017 | 0 | Hoch
    03.01.2017 | 0 | Niedrig
    03.01.2017 | 1 | Mittel

    Ich hoffe es ist eventuell jetzt klarer :) und der Eingangssatz soll nicht als Angriff zu verstehen sein, vielleicht verstehe ich es falsch, was wohlmöglich so sein wird aufgrund meiner Erfahrung mit SQL.

    PS: Danke dir auf jeden Fall, dass du mir hilfst. :)
     
  6. ukulele

    ukulele Datenbank-Guru

    Du suchst zunächst mal
    Code:
    SELECT   cast(StartDatum AS DATE),Prio,count(*) AS offene_Tickets
    FROM   tabelle
    WHERE   EndDatum IS NULL
    AND       StartDatum >= '2018-01-01'
    GROUP BY cast(StartDatum AS DATE),Prio
    ORDER BY cast(StartDatum AS DATE),Prio
    
    Ich weiß nicht, ob Access das auch als View bereitstellen kann, ansonsten ist das halt eine Abfrage. Das listet jetzt natürlich keine Einträge mit 0 Tickets auf, das ist etwas knifflig wie akretschmer schon sagte. Ist das denn wirklich erforderlich?
     
  7. 5abi1

    5abi1 Benutzer

    Nein es muss gar nicht einmal 0 Tickets aufliste, mir gehts sowieso hier nur um die offenen Tickets. :) Es würde auch schon reichen, wenn ich hier eine View auf einem SQL Server erreichen kann .. aber in access wäre es mir natürlich lieber.
     
  8. ukulele

    ukulele Datenbank-Guru

    Dann sollte meine Abfrage in Access laufen. Eventuell muss das Datumsformat im WHERE-Teil angepasst werden.
     
  9. 5abi1

    5abi1 Benutzer

    Also ich habs gerade versucht gehabt .. aber irgendwie funktioniert das SQL nicht .. das cast meldet einen Fehler .. Felddatentyp in Access ist Datum/Uhrzeit.
     
  10. 5abi1

    5abi1 Benutzer

    Da ich es leider nicht mehr bearbeiten kann - ich habs nun zum laufen gebracht. Funktioniert super. :) .. Danke für eure Hilfe. :)
     
  11. 5abi1

    5abi1 Benutzer

    Okey, ich brauche erneut eure Hilfe .. Diesmal ein etwas anderes Phänomen. Die Tabellen sehen genauso gleich aus. Nun möchte ich eine Historie aufbauen .. also ich habe Probleme die länger Dauern als ein Tag, also EndDatum größer als das StartDatum. Diese Tickets waren sozusagen noch am selben Tag offen und würden auch noch zu den offenen Tickets zählen am selben Tag .. wie realisiere ich denn dies?
     
  12. ukulele

    ukulele Datenbank-Guru

    Also wenn ich dich richtig verstehe müsstest du nur
    Code:
    WHERE 
    EndDatum IS NULL
    ersetzen durch etwas wie
    Code:
    WHERE
    ( EndDatum IS NULL OR datediff(day,StartDatum,EndDatum) > 1
    Erstmal ist dabei aber datediff(day,...) problematisch weil es auf ganze Zahlen rundet. Da musst du eventuell anders Rechnen, z.B. erst nur das Datum aus beiden Datum/Zeit-Werten extrahieren oder du rechnest in Stunden oder du sagst bis x Uhr am Folgetag, da kann man ziemlich viel basteln. Man muss nur etwas testen.
    Dann bin ich nicht sicher ob das ist was du suchst :)
     
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