• 我创建一个JasperReport使用例,正因为如此,我很有限的一个SQL query.

  • 我有一个表"统计",与一个'name'(VARCHAR),'count'(INTEGER),和'datetime'(DATETIME)列。

  • 它是简单的,足以得到的总和"计数"栏中的名称是"测试"的最后一天,并且同样的最后一个星期和月份(见下面)

工作SQL Statement:


SELECT
  SUM(count)as 'today'
FROM
  statistics
WHERE
   name = "test"
  AND $P{oneDayAgo} <= datetime
  AND datetime <= $P{now}
  • 然而,由于我只有一个,SQL statement的工作,我需要以某种方式将它们结合起来。我试图使用联盟(以下),但这没有工作。

失败的SQL Statement:

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}

(*)一个可以添加额外的查询只用图表或跨标签,无论其服务于我的目的。

有帮助吗?

解决方案

sum(情况下,当条件-然后数其他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}

请注意,如果您需要的平均时,一定要替代空对0.

其他提示

联盟会查询应产生相同的列(名称、类型)。集未使用列为空或使用differenciation柱:

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}

你有2个选择:

1)删除"为"部分,每个查询,然后它将为1栏,不会有一个名字

2)建立一个临时表,并插入这些行为的临时表格和随后的查询的临时表格

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top