3

表中的記錄包含一系列有效日期,例如: * tbl1.start_date *和* tbl1.end_date *。因此,爲了確保我獲得對特定日期範圍有效的所有記錄,選擇邏輯爲:<...> WHERE end_date >= @dtFrom AND start_date < @dtTo(在SQL語句中使用的@dtTo參數實際上是計算的第二天在* @ prmDt_To *參數中使用的報告)。SSRS 2008 - 多個分組日期範圍

現在在報告中,我需要計算指定數據範圍內每一天的記錄數,幷包括沒有有效記錄的天數(如果有的話)。因此,檢索到的記錄可能在幾個不同的日子裏被計算。我可以用數據集中的遞歸CTE相對容易地做到這一點,但我的經驗法則是避免SQL數據庫中不必要的負載,而只返回必要的原始數據並讓Report引擎處理分組。那麼在SSRS中有沒有辦法做到這一點?

謝謝 謝爾蓋

回答

1

你也許可以做到在SSRS與自定義代碼的東西,但我建議反對。要做到這一點的地方在數據集中。 SSRS不是用來填充數據集中不存在的組。這聽起來像你正在做的事情:無論日期是否在數據集中,SSRS都需要爲每個日期創建組。

如果您的數據庫中沒有數字或日期表,那麼我只需創建一個遞歸CTE,並在您感興趣的範圍內記錄每個日期的記錄。然後外面加入這個到你的表,並使用COUNT(tbl1.start_date)找到適當的日子。這對SQL服務器的查詢應該不會太痛苦。

如果您確實需要避免CTE,那麼我會創建一個日期或數字表以用於生成範圍中的日期。

+0

顯然,遞歸CTE是一個痛苦的查詢,僅僅幾天的數據提取花費了將近20秒,這在開發此報告的環境中是不可接受的。如果我只提取日期範圍的數據,而沒有CTE,則執行時間不到2秒。這就是爲什麼我想要在報表設計器中使用它的機制。 – krysolov 2013-03-06 22:07:06

+0

這部分將取決於您加入CTE的數據。嘗試用臨時表替換CTE以查看是否改變了性能。如果是這樣,那麼SQL爲CTE選擇了一個壞計劃,但臨時表應該是一個很好的解決方法。 另外,請確保您的表格上有適當的索引。 – 2013-03-07 00:56:06