1
  • 我正在使用 iReport 创建 JasperReport,因此,我仅限于*一个 SQL 查询。

  • 我有一个“统计”表,有一个“名称”(VARCHAR)、“计数”(INTEGER)和“日期时间”(DATETIME)列。

  • 当最后一天的“名称”为“测试”时,获得“计数”列的总和很简单,上周和月份也是如此(见下文)

工作 SQL 语句:


SELECT
  SUM(count)as 'today'
FROM
  statistics
WHERE
   name = "test"
  AND $P{oneDayAgo} <= datetime
  AND datetime <= $P{now}
  • 但是,由于我只有一个 SQL 语句可以使用,我需要以某种方式将它们组合起来。我尝试使用 UNION(如下所示),但这不起作用。

失败的 SQL 语句:

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}

(*) 只能为图表或交叉表添加额外的查询,这都不符合我的目的。

4

3 回答 3

3

总和(如果 -condition- 然后计数 else 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。

于 2009-06-16T16:42:57.787 回答
0

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}
于 2009-06-16T16:41:10.270 回答
0

您有 2 个选项:

1)删除每个查询的“as”部分,然后它将作为1列没有名称

2)创建一个临时表并将这些行插入到一个临时表中,然后查询该临时表

于 2009-06-16T16:45:48.377 回答