Как запросить несколько сумм одного и того же элемента с помощью SQL в iReport - PullRequest
1 голос
/ 16 июня 2009
  • Я создаю JasperReport, используя iReport, и поэтому я ограничен * одним запросом SQL.

  • У меня есть таблица 'статистика' со столбцами 'name' (VARCHAR), 'count' (INTEGER) и 'datetime' (DATETIME).

  • Достаточно просто получить сумму столбца 'count', когда 'name' было «test» для последнего дня, и аналогично для последней недели и месяца (см. Ниже)

Рабочий оператор SQL:


SELECT
  SUM(count)as 'today'
FROM
  statistics
WHERE
   name = "test"
  AND $P{oneDayAgo} <= datetime
  AND datetime <= $P{now}
  • Однако, поскольку у меня есть только один оператор SQL для работы, мне нужно как-то их объединить. Я пытался использовать UNION (как показано ниже), но это не сработало.

Неудачный оператор SQL: <pre> 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}

(*) можно добавлять дополнительные запросы только для графиков или кросс-таблиц, ни один из которых не служит моей цели.

Ответы [ 3 ]

4 голосов
/ 16 июня 2009

сумма (случай, когда -условие- затем считать еще 0 конец)

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}

обратите внимание, что если вам нужны средние значения, обязательно замените NULL на 0.

0 голосов
/ 16 июня 2009

У вас есть 2 варианта:

1) Удалите часть «как» из каждого запроса, и тогда он будет представлен в виде 1 столбца, который не будет иметь имени

2) Создайте временную таблицу и вставьте эти строки во временную таблицу, а затем запросите временную таблицу

0 голосов
/ 16 июня 2009

В запросах UNION должны быть одинаковые столбцы (имя, тип). Задайте для неиспользуемых столбцов значение NULL или используйте столбец дифференцирования:

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}
...