Datenbankabfrage 2 Datumsspalten

flamx

Neuer Benutzer
Beiträge
1
Hallo,

ich bin etwas am verzweifeln. Ich habe ein Tabelle, die in etwa so aussieht:

ID | TicketID | Summary | Created | Updated | Resolution | Resolutiondate |

Die Spalten Created und Resolutiondate sind datetime-Spalten. Ich brauche eine Abfrage, die mir ein Ergebnis in dieser Form liefert:

| Datum | Anzahl-Created | Anzahl-Resolved |

Sprich eine Tabelle die mir pro Tag, die Anzahl der created Tickets und die Anzahl der resolved Tickets aufweist. Resolved ist abhängig von Resolutiondate und der Resolution. Ist die Resolution 5, dann ist das Ticket resolved. Betrachte ich beides alleine, habe ich das hinbekommen. Aber das Problem ist, dass es Tage gibt, an denen zum Beispiel gar kein Ticket erstellt wurde, dafür aber resolved und umgekehrt. Ich brauche aber in der Spalte links, möglichst ein Datum, das mir alle Tage in einen bestimmen Zeitraum auflistet, unabhängig davon, ob an diesem Tag etwas erstellt oder resolved wurde. Ich hab schon versucht mit union, joins, alles mögliche, ich benutze und brauche mysql aber kaum und daher wäre ich für tipps und hinweise von euch dankbar!

Vielen Dank im Voraus!

Gruß flamx
 
Werbung:
Ich hab schon versucht mit union, joins, alles mögliche, ich benutze und brauche mysql aber kaum und daher wäre ich für tipps und hinweise von euch dankbar!

Vielen Dank im Voraus!

Gruß flamx

Ich nutze PostgreSQL und würde es z.B. so lösen:

Code:
test=*# select * from flamx ;
  created  | resolution | resolutiondate
------------+------------+----------------
 2014-06-01 |  5 | 2014-06-02
 2014-06-01 |  4 | 2014-06-03
 2014-06-01 |  |
  |  5 | 2014-06-04
(4 rows)

Das hast Du. Nun baue ich mir eine VIEW:

Code:
test=*# create view alle_tage as select ('2014-06-01'::date + s * '1day'::interval)::date from generate_series(0,9)s;
CREATE VIEW

Nicht zwingend nötig, vereinfach aber später das alles.

So, nun ohne beachtung der Resolution:

Code:
test=*# select t.date, count(f1.*), count(f2.*) from alle_tage t left join flamx f1 on t.date=f1.created left join flamx f2 on t.date=f2.resolutiondate group by t.date order by t.date;
  date  | count | count   
------------+-------+-------   
 2014-06-01 |  3 |  0   
 2014-06-02 |  0 |  1   
 2014-06-03 |  0 |  1   
 2014-06-04 |  0 |  1   
 2014-06-05 |  0 |  0   
 2014-06-06 |  0 |  0   
 2014-06-07 |  0 |  0   
 2014-06-08 |  0 |  0   
 2014-06-09 |  0 |  0   
 2014-06-10 |  0 |  0   
(10 rows)

Und mit Resolution=5:

Code:
test=*# select t.date, count(f1.*), count(f2.*) from alle_tage t left join flamx f1 on t.date=f1.created left join flamx f2 on t.date=f2.resolutiondate and f2.resolution=5 group by t.date order by t.date;   
  date  | count | count   
------------+-------+-------
 2014-06-01 |  3 |  0
 2014-06-02 |  0 |  1
 2014-06-03 |  0 |  0
 2014-06-04 |  0 |  1
 2014-06-05 |  0 |  0
 2014-06-06 |  0 |  0
 2014-06-07 |  0 |  0
 2014-06-08 |  0 |  0
 2014-06-09 |  0 |  0
 2014-06-10 |  0 |  0
(10 rows)


MySQL kennt kein generate_series(), Pech für Dich. Wirst Dir also irgend wie anders diese 'Hilfstabelle' bauen müssen, es gibt krude Workarounds dafür. Die 2 count - Spalten könnte man natürlich noch besser benennen.
 
In MySQL / MariaDB gibt es schon eine Möglichkeit Sequenzen zu erzeugen.

z.B.

SELECT date_add(now(), INTERVAL seq DAY) FROM seq_1_to_100_step_5;

2014-06-10 21:33:09
2014-06-15 21:33:09
2014-06-20 21:33:09
2014-06-25 21:33:09
2014-06-30 21:33:09
2014-07-05 21:33:09
2014-07-10 21:33:09
2014-07-15 21:33:09
2014-07-20 21:33:09
2014-07-25 21:33:09
2014-07-30 21:33:09

Falls das Plugin nich installiert ist kann man dies so einrichten:

INSTALL PLUGIN sequence SONAME 'ha_sequence';

Noch ein paar Infos dazu: https://mariadb.com/kb/en/sequence/

Gruss

Bernd
 
Nett. geht aber NUR in Maria, oder?

Abgesehen davon ist das IMHO auch wieder a bissl mistig realisiert:

MariaDB [test]> ALTER TABLE seq_1_to_100 ENGINE = BLACKHOLE;
Query OK, 0 rows affected (0.07 sec)

MariaDB [test]> SELECT * FROM seq_1_to_100;
Empty set (0.00 sec)

Wer nicht weiß, daß DIESE Tabelle nun SO behandelt wurde, fällt auf die Fresse.
 
Werbung:
Schön, stimmt,

das geht auch nicht wenn du im information_schema bist. Also USE information_schema. Dann musst du
einen DB Namen vor die Tabelle setzen .

Code:
SELECT * FROM mysql.seq_1_to_100;

Aber das alles steht ja schon auf der 1.en Seite der Doku. Und lesen musste schon ab un an.


PG wird schon seine Darseinsberechtigung haben. MySQL/MariaDB ist sehr weit verbreitet und
funktioniert einwandfrei auch in grossen Systemem problemlos.

Gruss

Bernd
 
Zurück
Oben