我正在Crystal Reports XI Developer中编写一个报表,该报表在SQL Server 2005数据库中运行存储过程。记录集返回按日和小时分组的日志表中的摘要。
目前我的查询看起来像这样:
SELECT
sum(colA) as "Total 1",
day(convert(smalldatetime, convert(float, Timestamp) / 1440 - 1)) as "Date",
datepart(hh, convert(smalldatetime, convert(float, Timestamp) / 1440 - 1)) as "Hour"
`etc...`
GROUP BY
Day, Hour
忽略日期疯狂,我认为系统设计师在制定如何存储日期时会大量饮酒。
我的问题是这样的:因为每天的每个小时都没有记录,所以我最终会有差距,这是可以理解的,但我希望Crystal能够在整个24小时内报告,而不管是否有数据。
我知道我可以通过将整个查询放在WHILE
循环(在存储过程中)并对各个小时进行查询来改变这一点,但我内心的某些内容表明一个查询优于24。 / p>
我想知道是否有办法让Crystal在一天中的几个小时内迭代,而不是像往常那样迭代表中的行。
或者,有没有办法格式化查询,使其包含空小时行而不会杀死我的数据库服务器?
答案 0 :(得分:2)
以下是我解决这个问题的方法:
答案 1 :(得分:2)
您可以使用WITH子句创建24小时,然后输出OUTER JOIN。
WITH hours AS (
SELECT 1 AS hour
UNION
SELECT 2 AS hour
...
SELECT 24 AS hour
)
SELECT *
FROM hours h
LEFT OUTER JOIN [your table] x ON h.hour=x.datepart(hh, convert(smalldatetime, convert(float, Timestamp) / 1440 - 1))
此SQL需要添加到命令。
在SQL或报告中根据需要进行分组。