有关使用GROUP BY的Crystal Reports + SQL Server存储过程的问题

时间:2011-06-07 18:50:32

标签: sql-server stored-procedures crystal-reports crystal-reports-xi

我正在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在一天中的几个小时内迭代,而不是像往常那样迭代表中的行。

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

2 个答案:

答案 0 :(得分:2)

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

  1. 在SQL-Server中创建本地表。称之为“LU_Hours”。
  2. 此表将包含1个整数字段(称为“小时”),其中包含24行。当然,值为1到24。
  3. 将此加入现有查询。
  4. 您可能需要对此进行调整,以确保空闲时间的空值处理得令您满意。

答案 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或报告中根据需要进行分组。