【问题标题】:How to query multiple SUMs of the same item using SQL in iReport如何在 iReport 中使用 SQL 查询同一项目的多个 SUM
【发布时间】:2009-06-16 16:37:48
【问题描述】:
  • 我正在使用 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}

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

【问题讨论】:

  • 如果您发布表格定义和所需输出的示例,我相信有人可以帮助您...

标签: java sql jasper-reports ireport


【解决方案1】:

sum(case when -condition- then count else 0 end)

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。

【讨论】:

  • $P{} - 这是 Jasper 的魔法,还是我从未见过的 SQL 语言的某些部分?
  • $P{} 是 Jasper 的魔法! (只是报告中指定的一个参数)
  • 酷,谢谢 Hafthor,我不知道这是“更快”还是“更好”,但它绝对更干净更清晰。
【解决方案2】:

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}

【讨论】:

  • 那么如何区分“日”和“周”与“月”行?
  • 您也可以使用 CASE/WHEN 来计算 'when' 列,而不是 UNION。
  • 此解决方案将为您提供 3 行 2 列(3 个“总计”和 3 个“时间”)。 Hafthor 会给你一行 3 列,也许更可取。
【解决方案3】:

你有两个选择:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多