如何查询的多款项的同一项目使用SQL在例
-
05-07-2019 - |
题
我创建一个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)建立一个临时表,并插入这些行为的临时表格和随后的查询的临时表格
不隶属于 StackOverflow