0

我正在SQL Server 2005數據庫中運行存儲過程的Crystal Reports XI Developer中編寫報表。記錄集返回按日和小時分組的日誌摘要。關於Crystal Reports + SQL Server存儲過程與GROUP BY的問題

目前我的查詢看起來是這樣的:

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在一天的幾個小時內迭代,而不是像往常一樣迭代表中的行。

另外,有沒有一種方法來格式化查詢,以便它包含空的小時行而不會殺死我的數據庫服務器?

回答

2

以下是我解決了這個問題:

  1. 在你的SQL Server中創建本地表。稱它爲「LU_Hours」。
  2. 該表格將有1個整數字段(稱爲「小時數」),其中有24行。當然,值將是1到24.
  3. 將此加入到您現有的查詢中。
  4. 您可能需要對此進行調整,以確保空時小數的零點值得您滿意處理。
+0

由於我按天和小時分組,所以創建列表爲每月的天(1-31)以及一天中的幾小時列表是否有意義?像: (1,0)(1,1)...(1,23)(2,1)(2,2)...(31,22)(31,23) – nageeb 2011-06-07 19:35:08

+0

該月的日期爲有點難度,因爲它們每個月有所不同,有些年份是閏年。用幾年的日期製作一張桌子(Excel對此很有用)。然後將此LU_Date表加入LU_Hours以獲得最終的幫助表。 – PowerUser 2011-06-09 12:40:52

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或報告中進行分組。