我正在尝试在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
答案 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
之间更改查询条件开始和结束日期。)