0

我正在 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 个。

我想知道是否有办法让 Crystal 在一天中的几个小时内迭代,而不是像往常一样迭代表中的行。

或者,有没有办法格式化查询,以便它包含空的小时行而不杀死我的数据库服务器?

4

2 回答 2

2

这是我解决这个问题的方法:

  1. 在 SQL-Server 中创建一个本地表。称之为“LU_Hours”。
  2. 此表将有 1 个整数字段(称为“小时”),有 24 行。当然,值将是 1 到 24。
  3. 将其加入到您现有的查询中。
  4. 您可能需要对此进行调整,以确保您满意地处理空工作时间的空值。
于 2011-06-07T19:08:05.177 回答
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 或报告中进行分组。

于 2011-06-07T19:58:56.153 回答