2016-08-07 56 views
1

Ich habe mehrere Jahre im Wert von Daten in einer Tabelle (Anfragen). Jeder Eintrag hat ein contact_time-Feld, das der Zeitstempel ihres E-Mail-Kontakts ist. Ich versuche, monatliche oder wöchentliche Zusammenfassungsdaten für das Plotten auf einem Multiseriendiagramm zu erstellen. Zu diesem Zweck muß ich die Monats- oder Wochennummer in der ersten Spalte mit den entsprechenden Daten ab 2014 in der zweiten Spalte sehen, und ab 2015 in der dritten Spalte, usw.Multi-Serie (Spalte) MySQL Query wird nicht richtig zusammenfassen

SELECT MONTH(inquiries.contact_time) AS "Date", 
(SELECT 
    COUNT(inquiries.id) AS "Inquiries" 
    FROM inquiries 
    WHERE YEAR(inquiries.contact_time) = "2014" 
) AS "2014", 
(SELECT COUNT(inquiries.id) AS "Inquiries" 
    FROM inquiries 
    WHERE YEAR(inquiries.contact_time) = "2015" 
) AS "2015" 
FROM inquiries 
GROUP BY MONTH(inquiries.contact_time) 

Alles, was ich zu sehen bin ist die Gesamtanzahl für jedes Jahr in allen Zeilen. Jede Hilfe wird geschätzt.

Antwort

1

Sie sehen die Gesamtzählung für das Jahr, da Ihre Unterabfragen nicht mit dem Monat für die Gruppierung der äußeren Abfrage verknüpft sind.

Ich würde die Abfrage auf diese Weise schreiben:

SELECT MONTH(contact_time) AS `Date`, 
    SUM(YEAR(contact_time)=2014) AS `2014`, 
    SUM(YEAR(contact_time)=2015) AS `2015` 
FROM inquiries 
GROUP BY MONTH(contact_time) 

Erläuterung: die COUNT() einen spezifischen Satzes von Zeilen ist das gleiche wie die SUM() von 1 ist für diese Zeilen. Und die booleschen Ausdrücke von MySQL geben die Ganzzahl 1 für true zurück.

+0

Sehr geschätzt, das war die Lösung. – acatx

2

Verwendung bedingte Aggregation:

SELECT MONTH(i.contact_time), 
     SUM(YEAR(i.contact_time) = 2014) as cnt_2014, 
     SUM(YEAR(i.contact_time) = 2015) as cnt_2015 
FROM inquiries i 
WHERE YEAR(i.contact_time) >= 2014 
GROUP BY MONTH(i.contact_time); 

Wenn Sie einen Index auf contact_time haben, dann verwenden Sie den Zustand where i.contact_time >= '2014-01-01', so dass es den Vorteil des Index zu nehmen.