跨表的数据趋势

时间:2012-03-28 16:53:33

标签: sql sql-server-2008 tsql reporting-services

我正在尝试在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

然后我需要为每个文件夹计算出几个月的趋势,以便文件夹A的Jan和Feb之间的差异在0和2月到3月之间为-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  

2 个答案:

答案 0 :(得分:0)

您可以使用外部联接获取第二个输出并使用isnull(filedate,0)。我怀疑你在正确使用时正在使用左,但你没有提供足够的细节。

答案 1 :(得分: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之间更改查询条件开始和结束日期。)