【问题标题】:Question about Crystal Reports + SQL Server stored procedure with GROUP BY关于水晶报表 + SQL Server 存储过程与 GROUP BY 的问题
【发布时间】:2011-06-08 03:58:56
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我是这样解决这个问题的:

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

    【讨论】:

    • 由于我是按天和按小时分组的,因此创建包含月份(1-31)天和一天中小时的列的表是否有意义?比如:(1,0)(1,1)...(1,23)(2,1)(2,2)...(31,22)(31,23)
    • 一个月中的日子有点困难,因为它们因月而异,有些年份是闰年。制作一张包含几年日期的表格(Excel 对此很有用)。然后将此 LU_Date 表外连接到 LU_Hours 以获得最终的帮助表。
    【解决方案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 或报告中分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-14
      • 2011-10-12
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多