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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top