2016-10-19 6 views
2

Ich habe ein Problem mit, wie diese Abfrage die Daten zurückgibt. Die timestamp gibt korrekt zurück, und newpost gibt korrekt zurück, aber gelöste Post und geschlossene Post werden nicht korrekt zurückgegeben. Problem, in das ich hineingeraten bin, hatte ich heute eine Instanz, wo jemand heute eine Reihe von Tickets geschlossen hat, aber weil sie älter waren als das, was in den letzten 7 Tagen gefunden wurde (das für Charts), zählte sie sie nicht, weil ich ' m Verwendung erstellt als die Reihenfolge von Gruppe nach. Die Sache ist erstellt ist das Datum, das es erstellt wurde als timestamp für das Diagramm und als die Erstellungszeit für das Ticket sowie newpost.mysql COUNT() mit CASE

Am Ende des Tages den 18. 12 newposts, Arbeits 1 solved und 22 closed aber es ist nicht

SELECT 
    DATE(created) timestamp, 
    COUNT(created) newpost, 
    COUNT(CASE WHEN DATE(closed) AND (sent = 0 OR sent = 1) THEN closed END) solvedpost, 
    COUNT(CASE WHEN DATE(closed) AND (sent = 2) THEN closed END) closedpost 
FROM 
    tickets 
GROUP BY DATE(created) 
ORDER BY DATE(created) DESC 
LIMIT 7 

SAMPLE DATA haben sollte: Tickets ---

| post_id| sent |  created  |  closed 
| 546nby | 2 | 2016-09-23 19:58:46 | 2016-10-18 19:00:53 | 
| 540r72 | 2 | 2016-09-22 19:33:07 | 2016-10-18 18:00:56 | 
| 54jjc2 | 2 | 2016-09-26 07:41:45 | 2016-10-18 18:00:54 | 
| 5720p8 | 2 | 2016-10-12 02:55:35 | 2016-10-18 18:00:52 | 
| 57a5qo | 2 | 2016-10-13 13:09:54 | 2016-10-18 18:00:50 | 
| 4zp83k | 2 | 2016-08-26 15:40:55 | 2016-10-18 14:00:47 | 
| 4zpu3c | 2 | 2016-08-26 17:36:19 | 2016-10-18 14:00:45 | 
| 545qvv | 2 | 2016-09-23 17:03:08 | 2016-10-18 13:01:17 | 
| 5475fv | 2 | 2016-09-23 21:41:17 | 2016-10-18 13:01:15 | 
| 549u2z | 2 | 2016-09-24 12:01:35 | 2016-10-18 13:01:13 | 
| 54ct4l | 2 | 2016-09-25 00:07:39 | 2016-10-18 13:01:11 | 
| 54gksl | 2 | 2016-09-25 19:07:58 | 2016-10-18 13:01:09 | 
| 54ippx | 2 | 2016-09-26 03:15:33 | 2016-10-18 13:01:07 | 
| 54mxvf | 2 | 2016-09-26 21:09:21 | 2016-10-18 13:01:05 | 
| 54yhfh | 2 | 2016-09-28 20:35:32 | 2016-10-18 13:01:03 | 
| 55gxw7 | 2 | 2016-10-02 04:58:23 | 2016-10-18 13:01:01 | 
| 55l2sz | 2 | 2016-10-03 00:11:01 | 2016-10-18 13:00:59 | 
| 55ozq6 | 2 | 2016-10-03 18:04:24 | 2016-10-18 13:00:57 | 
| 55txmx | 2 | 2016-10-04 15:09:11 | 2016-10-18 13:00:55 | 
| 55vi46 | 2 | 2016-10-04 20:06:39 | 2016-10-18 13:00:53 | 
| 55yw80 | 2 | 2016-10-05 10:56:29 | 2016-10-18 13:00:51 | 
| 561wzj | 2 | 2016-10-05 21:26:43 | 2016-10-18 13:00:49 | 
| 56fzlm | 0 | 2016-10-08 07:25:22 | 2016-10-18 13:00:45 | 
| 56sjln | 1 | 2016-10-10 15:34:01 | 2016-10-18 01:00:48 | 
| 57luzw | 1 | 2016-10-15 12:34:50 | 2016-10-17 18:00:44 | 
| 56tlp8 | 1 | 2016-10-10 18:44:46 | 2016-10-17 16:00:44 | 
| 578e6y | 0 | 2016-10-13 03:56:29 | 2016-10-17 05:00:47 | 
| 56931q | 1 | 2016-10-07 02:01:46 | 2016-10-17 04:00:44 | 
| 55wjpf | 1 | 2016-10-04 23:38:30 | 2016-10-16 23:00:47 | 
| 56tye6 | 1 | 2016-10-10 19:45:46 | 2016-10-16 23:00:45 | 
| 56wvge | 1 | 2016-10-11 07:07:50 | 2016-10-16 23:00:43 | 
| 57sfd6 | 2 | 2016-10-16 17:16:28 | 2016-10-16 18:00:36 | 

@ Drapp

Results 
--- 
| timestamp | newpost | solvedpost | closedpost | 
| 2016-10-19 | 4 | 0 | 0 | 
| 2016-10-18 | 12 | 0 | 0 | 
| 2016-10-17 | 8 | 0 | 0 | 
| 2016-10-16 | 6 | 0 | 1 | 
| 2016-10-15 | 8 | 1 | 0 | 
| 2016-10-14 | 11 | 2 | 1 | 
| 2016-10-13 | 12 | 3 | 1 | 

Ergebnisse gebrochener Abfrage Heres The results

+0

Pls die Beispieldaten mit uns teilen, gibt es keine Art, wie wir denken können, was gegangen sein falsch mit der Abfrage ohne es. – Shadow

+0

Ich habe das entschuldigt. –

Antwort

1

Ok, ich denke, ich verstehe, was Sie wollen, und ich werde klären. Hoffentlich hilft dir mein Schreiben dabei, zukünftige Beiträge zu erklären.

Für Ihre Daten haben Sie Tickets mit, wenn erstellt, wenn geschlossen, und einen Status, wie geschlossen.

Ich brauche eine Zusammenfassung für jeden Tag der betreffenden Aktivität abgerufen werden. Auch wenn ein Ticket am 9. Oktober erstellt wurde und am 18. Oktober geschlossen wurde, muss die Aktivität für das geschlossene Datum auf dem 18. Übersichtsdatensatz erscheinen.

Um dies zu tun, benötigen Sie eine Unterabfrage, um alle abgeschlossenen Aktivitäten zusammengefasst UND die primäre basierend auf dem fraglichen Datum zu erhalten. Aber jetzt, was ist, wenn Sie ein Datum haben, an dem keine Tickets erstellt werden, aber einige sind geschlossen ... Ich weiß, Anomalie-Bedingung, und ich werde das nicht abfragen.

So ein bereinigtes Abfrage als

SELECT 
     DATE(T1.created) DateActivity, 
     COUNT(T1.*) newpost, 
     MAX(COALESCE(ClosedActivity.ClosedEntries, 0)) as ClosedEntries, 
     MAX(COALESCE(ClosedActivity.ClosedPost, 0)) as ClosedPosts, 
     MAX(COALESCE(ClosedActivity.SolvedPost, 0)) as SolvedPosts 
    FROM 
     tickets T1 
     LEFT JOIN 
     (select 
       DATE(closed) DateClosed, 
       COUNT(*) as ClosedEntries, 
       SUM(case when sent = 2 then 1 else 0 end) as ClosedPost, 
       SUM(case when sent = 0 OR sent = 1 then 1 else 0 end) as SolvedPost 
       from 
       tickets 
       where 
       closed >= date_add(current_date(), interval -7 day) 
       GROUP BY 
       DATE(closed)) ClosedActivity 
      ON 
       DATE(T1.Created) = ClosedActivity.DateClosed 
    where 
     T1.created >= date_add(current_date(), interval -7 day) 
    GROUP BY 
     DATE(T1.created) 
    ORDER BY 
     DATE(T1.created) DESC 
    LIMIT 7 

Hinweis angewendet I Datum Mathe 7 Tage von Strom zu subtrahieren. Auf diese Weise werden nur Aktivitäten erfasst, bei denen das Ticket innerhalb der letzten 7 Tage erstellt wurde. Wenn Ihre Daten jahrelange Daten haben, wird sie alles durchkauen, DANN werden nur die letzten 7 zurückgegeben. Ich beginne nur mit den letzten 7 Tagen der Aktivität.

Da ein geschlossenes Ticket nie früher sein kann als wenn es erstellt wurde, ist das innerhalb der 7 Tage qualifiziert.

Also jetzt mit der einzelnen Zeile pro Datum auf der inneren Abfrage, ich ein MAX() dieses Ergebnis anwenden, da es nie basierend auf der Anzahl der äußeren Einträge der erstellten Tickets ändern wird. Andernfalls kann die Engine über Spalten spalten, die nicht Teil der group by-Klausel sind, die keine Aggregatspalten sind.

Ich denke, das ist, was Sie suchen.

+0

Ich habe gerade versucht dies und die Ergebnisse dafür –

+0

@AlexBloom, nicht wahr?!? – DRapp

+0

lol sorry es abgeschnitten meine Antwort, als ich tippte ich denke. Dies kann auf dem richtigen Weg, aber nicht wie beabsichtigt 18. arbeiten, sollten folgende Voraussetzungen erfüllt sein, wenn alles '12 newposts', 1' solved' und 22 'closed' Abfrageergebnisse arbeitet --- | Zeitstempel | newpost | gelöster Post | geschlossener Pfosten | | - | -: | -: | -: | | 2016-10-19 | 4 | 0 | 0 | | 2016-10-18 | 12 | 0 | 0 | | 2016-10-17 | 8 | 0 | 0 | | 2016-10-16 | 6 | 0 | 1 | | 2016-10-15 | 8 | 1 | 0 | | 2016-10-14 | 11 | 2 | 1 | | 2016-10-13 | 12 | 3 | 1 | –

0

DATE (geschlossen) kehrt nicht boolean Datum, sollten Sie so etwas wie betrachten:

closed>=curdate() 

zu decken heute Termine und vermeiden Lauffeldwerte durch eine Funktion

+0

ausprobiert, und es hat nicht getan, was ich brauchte es zu tun –

0

ändern

COUNT(CASE WHEN DATE(closed) AND (sent = 2) THEN closed END) closedpost 

zu

SUM(DATE(closed) = DATE(created) AND (sent = 2)) closedpost 

(Das Gleiche gilt für die anderen Zähler.)