Wie mehrere SUMs des gleichen Elements mit Hilfe von SQL in iReport abfragen
-
05-07-2019 - |
Frage
-
Ich erstelle eine Jasper iReport verwenden, und als solche, ich bin begrenzt * zu einem SQL-Abfrage.
-
Ich habe eine Tabelle 'Statistik', mit 'name' (VARCHAR), 'count' (INTEGER) und 'Datetime' (DATETIME-) Spalten.
-
Es ist einfach genug, um die Summe der ‚count‘ Spalt zu erhalten, wenn der ‚name‘ „test“ für den letzten Tag war, und in ähnlicher Weise für die letzte Woche und Monat (siehe unten)
Arbeits SQL-Anweisung:
SELECT
SUM(count)as 'today'
FROM
statistics
WHERE
name = "test"
AND $P{oneDayAgo} <= datetime
AND datetime <= $P{now}
- Da ich nur eine SQL-Anweisung für die Arbeit mit, ich brauche sie irgendwie zu kombinieren. Ich versuchte UNION (wie unten) verwenden, aber dies funktionierte nicht.
fehlgeschlagen SQL-Anweisung:
SELECT
SUM(count)as 'today'
FROM
statistics
WHERE
name = "test"
AND $P{oneDayAgo} <= datetime
AND datetime <= $P{now}
UNION
SELECT
SUM(count)as 'thisWeek'
FROM
statistics
WHERE
name = "test"
AND $P{oneWeekAgo} <= datetime
AND datetime <= $P{now}
UNION
SELECT
SUM(count)as 'thisMonth'
FROM
statistics
WHERE
name = "test"
AND $P{oneMonthAgo} <= datetime
AND datetime <= $P{now}
(*) kann eine zusätzliche Abfragen hinzufügen nur für Graphen oder Kreuztabellen, von denen keinem meinen Zweck dienen.
Lösung
Summe (Fall, wenn -condition- dann zählt sonst 0 Ende)
SELECT
SUM(case when $P{oneDayAgo} <= datetime then count else 0 end) as 'today',
SUM(case when $P{oneWeekAgo} <= datetime then count else 0 end) as 'thisweek',
SUM(count) as 'thismonth'
FROM
statistics
WHERE
name = "test"
AND $P{oneMonthAgo} <= datetime
AND datetime <= $P{now}
beachten Sie, dass, wenn Sie Mittelwerte benötigen, sollten Sie NULL für 0 ersetzen.
Andere Tipps
UNION'd Abfragen sollten die gleichen Spalten (Name, Typ) erzeugen. Legen Sie nicht verwendete Spalten auf NULL oder eine Differenzierung Spalte zu verwenden:
SELECT
SUM(count) as `total`,
'today' as `when`
FROM
statistics
WHERE
name = "test"
AND $P{oneDayAgo} <= datetime
AND datetime <= $P{now}
UNION
SELECT
SUM(count) as `total`,
'thisWeek' as `when`
FROM
statistics
WHERE
name = "test"
AND $P{oneWeekAgo} <= datetime
AND datetime <= $P{now}
UNION
SELECT
SUM(count) as `total`,
'thisMonth' as `when`
FROM
statistics
WHERE
name = "test"
AND $P{oneMonthAgo} <= datetime
AND datetime <= $P{now}
Sie haben 2 Möglichkeiten:
1) Entfernen Sie die ‚als‘ Teil jeder Abfrage und dann wird es als 1 Spalte kommen, die keinen Namen haben
2) Erstellen Sie eine temporäre Tabelle und die Zeilen in eine temporäre Tabelle einfügen und dann die temporäre Tabelle abfragen