2017-10-10 1 views
1

Ich versuche, eine Abfrage zu erstellen, die es mir ermöglicht, einen prozentualen Wert für jeden Monat zu erhalten, der Ausgaben, Einkommen und Einsparungen vergleicht miteinander. Ich benutze MySQL-Datenbank.MySQL vergleicht Gesamtsummen zu allen Summen in Ausgaben, Einkommen, Einsparungen (3 verschiedene Tabellen) als Prozentsatz pro Monat

Beispiel auf die Tabellen und die Abfrage: http://sqlfiddle.com/#!9/78b360/1

Bisher bin ich in der Lage, die Summe pro Monat von jedem Tisch zu bekommen:

SELECT * 
FROM(
SELECT sum(amount) AS Total, month(date) AS Month FROM expenses 
UNION ALL 
SELECT sum(amount), month(date) FROM income 
UNION ALL 
SELECT sum(amount), month(date) FROM savings 
GROUP BY month(date)) as grand_total 

Ergebnis:

| Total | Month | 
|---------|-------| 
| 1323232 |  9 | 
| 300101 |  9 | 
| 20000 |  9 | 
|  1 | 10 | 

was ich versuche zu erreichen, ist etwas wie das, wenn ich nur auf Monat 9 schaue:

| Total | Month | Percent 
|---------|-------|-------- 
| 1323232 |  9 |  81% 
| 300101 |  9 |  18% 
| 20000 |  9 |  1% 

Können Sie mir bitte hier helfen? Ich habe viele-viele Antworten auf stackoverflow und anderen Seiten angeschaut, konnte aber nicht finden, was ich genau benötigte. Deine Hilfe ist sehr Willkommen. Vielen Dank.

Antwort

0

Das Problem mit Ihrer aktuellen Abfrage besteht darin, dass Sie nicht monatlich in den Tabellen expenses oder income aggregieren, sondern nur für die Tabelle savings. Die endgültige GROUP BY tut nicht gelten für alles.

Ich denke, was Sie hier tun müssen, ist zuerst nach Monat über jede der drei Tabellen zu aggregieren, diese Ergebnisse zusammenzuführen und dann ein zweites Mal nach Monat zu aggregieren, um die Gesamtsumme für jeden Monat zu erhalten.

SELECT 
    month, 
    SUM(total) AS month_total 
FROM 
(
    SELECT MONTH(date) AS month, SUM(amount) AS total 
    FROM expenses 
    GROUP BY MONTH(date) 
    UNION ALL 
    SELECT MONTH(date), SUM(amount) 
    FROM income 
    GROUP BY MONTH(date) 
    UNION ALL 
    SELECT MONTH(date), SUM(amount) 
    FROM savings 
    GROUP BY MONTH(date) 
) t 
-- WHERE month = 9   -- or whichever months you want to see 
GROUP BY 
    month 
ORDER BY 
    month 
+0

Ich dachte, die endgültige 'GROUP BY' trifft zu. Es tut uns leid. Jetzt kann ich aggregieren, um die Prozentsätze zu erhalten. Nett! – Gee

+0

Wie würde ich ein zweites Mal pro Monat aggregieren, um die Gesamtsumme für jeden Monat zu erhalten? – Gee

+0

Meine Antwort gibt bereits die Gesamtsumme für jeden Monat. –

Verwandte Themen