2012-03-28 73 views
0

我正試圖找出一個sql表格的趨勢,該表格包含在設定的時間段內輸入文件系統文件夾的文件條目。我有一個包含日期時間,另一個包含所有我感興趣的文件夾中的一個表時,我加入(右外),這兩個我得到一個表像下面:跨表格的數據趨勢

Jan 2012, folder A 2 
Jan 2012, folder B 4 
Feb 2012, folder A 2 
Feb 2012, folder B 2 

但是,如果沒有信息已輸入一個日期間隔,我只是得到空值,所以 2012年3月,null,null

有什麼辦法,我可以爲每個文件夾添加到此表中的零?這會給我:

Jan 2012, folder A 2 
Jan 2012, folder B 4 
Feb 2012, folder A 2 
Feb 2012, folder B 2 
Mar 2012, folder A 0 
Mar 2012, folder B 0 

然後我需要計算出過去幾個月趨勢對每個文件夾,以便對文件夾中的 - 2月之間的差爲0和二月三月和這之間-200%給我的決賽桌:

Jan 2012, folder A 2 0 (first month no data) 
Jan 2012, folder B 4 0 (first month no data) 
Feb 2012, folder A 2 200% (increase on Jan) 
Feb 2012, folder B 2 -50% (decrease on Jan) 
Mar 2012, folder A 0 -200% (decrease on Feb) 
Mar 2012, folder B 0 -200% (decrease on Feb) 

這將最終在SSRS報告結束了,所以如果該趨勢在查詢或通過報表生成器發生了也沒關係。

任何幫助,這將不勝感激。

我的表模式是這樣的:

文件夾表:

DECLARE @folders TABLE (folderId int, folderPath varchar(500)) 

文件表:

DECLARE @filessAdded TABLE 
(fileId int, 
    parentId int, 
    folderPath varchar(500), 
    eventDate DATETIME, 
    folderId int); 

日期表 - 動態填充基於在一定時期內例如,幾個月時間間隔:

DECLARE @dates TABLE (DateOf VARCHAR(500)); 

我最後的查詢如下所示:

select isnull(Total,0), 
     folder, 
     dates.DateOf, 
     trend 
from @filesAdded as files 
right join @dates as dates on files.DateOf = dates.DateOf 
+0

什麼是您正在使用的查詢?你的數據模式是什麼樣的(即表和字段名稱)? – mellamokb 2012-03-28 20:09:43

+0

@Kievia:不應該%更改列閱讀:0,0,0,-50%,-100%,-100%? – 2012-03-29 08:13:30

+0

是的,寫作太遲了 – Kievia 2012-03-29 13:25:28

回答

0

我建議改變查詢是:

with cte as 
(select d.DateOf, 
     f.folderPath, 
     count(case when datediff(month,f.DateOf,d.DateOf) = 0 then a.fileId end) 
      fileCount, 
     dense_rank() over (partition by f.folderPath order by d.DateOf) dr 
from @dates d 
cross join @folders f 
left join @filessAdded a on f.folderId = a.folderId 
group by d.DateOf, f.folderPath) 
select c1.*, 
     case when coalesce(c0.fileCount, 0) = 0 then 0 
      else (c1.fileCount - c0.fileCount)/c0.fileCount 
     end perChange 
from cte c1 
left join cte c0 on c1.folderPath = c0.folderPath and c1.dr - 1 = c0.dr 

說明個月其他時間段求和的時候,你將需要更改DATEDIFF條件。 (或者,您可以使用開始日期和結束日期列填充@dates而不是單個日期列,然後根據@filessAdded日期是否在@dates開始日期和結束日期之間更改查詢條件。)

+0

我們最終選擇了開始和結束日期列並重新計算以前計算的日期 - 僅在將文件添加到文件夾後才寫入日期。 – Kievia 2012-03-29 13:26:59

0

你可以得到一個外的第二輸出連接和使用ISNULL(FILEDATE,0)。我懷疑你應該在正確使用時使用左手,但是你沒有給出足夠的細節。

+0

感謝您的回覆。如果我使用左連接,我會丟失所有沒有輸入文件夾的文件行,並得到:* Jan文件夾A 3 * Mar文件夾A 4右連接保留我的日期列,但丟失文件夾:* Jan文件夾A 3 * Feb null null * Mar文件夾A 4理想情況下,我希望Feb閱讀文件夾A 0但我不知道如何 – Kievia 2012-03-29 07:28:50

+0

嘗試完整外部連接 – Paparazzi 2012-03-29 13:11:36