ich die folgende Abfrage bin mit der Gruppe Arbeitszeit und Kosten für Kunden aus drei Tabellen, einem für Kunden, ein für Arbeitszeiten und einem für Ausgaben:Mit GROUP BY und ORDER BY auf einer inneren SQL-Abfrage JOIN
SELECT a.*,
COALESCE(b.totalCount, 0) AS CountWork,
COALESCE(b.totalAmount, 0) AS WorkTotal,
COALESCE(c.totalCount, 0) AS CountExpense,
COALESCE(c.totalAmount, 0) AS ExpenseTotal
FROM clients A
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount
FROM work_times
WHERE DATE BETWEEN '2013-01-01' AND '2013-02-01'
GROUP BY Client
) b ON a.Client = b.Client
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount
FROM expenses
WHERE DATE BETWEEN '2013-01-01' AND '2013-02-01'
GROUP BY Client
) c ON a.Client = c.Client
WHERE b.Client IS NOT NULL OR
c.Client IS NOT NULL
Sie können die Abfrage in einer Geige here arbeiten sehen.
Ich versuche diese Abfrage zu ändern, so dass für jeden Monat eine Zeile für jeden Monat nach Monat und dann Client sortiert ist. Ich versuche, so mit der folgenden geändertenen Abfrage zu tun:
SELECT a.*,
COALESCE(b.totalCount, 0) AS CountWork,
COALESCE(b.totalAmount, 0) AS WorkTotal,
COALESCE(c.totalCount, 0) AS CountExpense,
COALESCE(c.totalAmount, 0) AS ExpenseTotal
FROM clients A
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount,
SUBSTR(Date, 1, 7) as Month
FROM work_times
GROUP BY Month,Client
ORDER BY Month
) b ON a.Client = b.Client
LEFT JOIN
(
SELECT Client,
COUNT(*) totalCount,
SUM(Amount) totalAmount,
SUBSTR(Date, 1, 7) as Month
FROM expenses
GROUP BY Month,Client
ORDER BY Month,Client
) c ON a.Client = c.Client
WHERE b.Client IS NOT NULL OR
c.Client IS NOT NULL
Sie können die geänderte Abfrage in Aktion here sehen.
Es funktioniert jedoch nicht ganz richtig. Für Client B wird nur eine Zeile zurückgegeben, obwohl eine Arbeitszeit im Januar 2013 und eine Ausgabe im Februar 2013 (also zwei Zeilen) vorhanden sind. Es scheint, dass die Zeilen von Client im Gegensatz zu Monat sortiert werden. Könnte jemand vorschlagen, wie die Abfrage zu ändern, würde die gewünschte Ausgabe, die für das Beispiel auf der zweite Geige zu bekommen sein:
╔════════╦═══════════╦═══════════╦══════════════╦══════════════╗
║ CLIENT ║ COUNTWORK ║ WORKTOTAL ║ COUNTEXPENSE ║ EXPENSETOTAL ║
╠════════╬═══════════╬═══════════╬══════════════╬══════════════╣
║ A ║ 1 ║ 10 ║ 1 ║ 10 ║
║ B ║ 1 ║ 20 ║ 0 ║ 0 ║
║ A ║ 1 ║ 15 ║ 0 ║ 0 ║
║ B ║ 0 ║ 0 ║ 1 ║ 10 ║
║ C ║ 1 ║ 10 ║ 0 ║ 0 ║
╚════════╩═══════════╩═══════════╩══════════════╩══════════════╝
Sie können als 'ORDER BY' für die beiden Unter wählt müssen. Legen Sie das für die endgültige Antwort. –
Wenn Datum ein Datetime-Datentyp ist, warum/wie machen Sie einen Teilstring() darauf? – wildplasser
Ihre Tabellen haben redundante Daten, Menge und Datum. Sie müssen Ihre Struktur weiter normalisieren und die Redundanz beseitigen. Die Abfrage ist zu zweideutig, Sie möchten bestimmte Daten sehen, aber es gibt keine Auswahlkriterien außer "Client-ID ist nicht null" **. Wenn Sie Daten für einen bestimmten Zeitraum nach Monat gruppiert anzeigen möchten, suchen Sie nach dem Datum. Ich würde zurücktreten und die Normalisierung als mein erstes Problem betrachten. –