Данные трендовые по всей таблице - PullRequest
0 голосов
/ 28 марта 2012

Я пытаюсь выработать тренд для таблицы SQL, которая содержит записи для файлов, входящих в папки файловой системы в течение заданного периода времени.У меня есть таблица с периодами дат, а другая - со всеми интересующими меня папками. Когда я присоединяюсь (справа наружу), я получаю таблицу, подобную приведенной ниже:

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

Однако, если нетинформация была введена для интервала дат. Я просто получаю значения NULL, поэтому март 2012 г., 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 составляла от 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  

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Я предлагаю изменить запрос на:

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

Обратите внимание, что вам нужно будет изменить условие датировки при суммировании за периоды, отличные по месяцам. (В качестве альтернативы вы можете заполнить @dates столбцами даты начала и окончания вместо одного столбца даты, а затем изменить условие запроса, основываясь на том, была ли дата @filessAdded между датами начала и окончания @dates.)

0 голосов
/ 29 марта 2012

Вы можете получить второй вывод с внешним соединением и использовать isnull (filedate, 0). Я подозреваю, что вы используете левую, когда вы должны использовать правую, но вы не даете достаточно деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...