SQL Berechnung

5abi1

Benutzer
Beiträge
7
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.
 
Werbung:
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?
 
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. :)
 
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.
 
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. :)
 
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?
 
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.
 
Dann sollte meine Abfrage in Access laufen. Eventuell muss das Datumsformat im WHERE-Teil angepasst werden.
 
Also ich habs gerade versucht gehabt .. aber irgendwie funktioniert das SQL nicht .. das cast meldet einen Fehler .. Felddatentyp in Access ist Datum/Uhrzeit.
 
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?
 
Werbung:
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 :)
 
Zurück
Oben