Сводные данные в SQL Server - PullRequest
2 голосов
/ 21 марта 2012

Мне нужно создать отчет с помощью хранимой процедуры SQL Server 2008R2, которая будет возвращать следующую форму данных: enter image description here

Мое представление в SQL Server возвращает данные, подобные этим: enter image description here

Пользователь выберет start_date и end_date, и этот диапазон дат будет отображаться в столбцах, т. Е. Если пользователь выберет апрель 1,2012 - 7 апреля 2012, то через 7 дней в столбцах будут отображаться дни от 1 до 7. В левом столбце будут показаны итоги поля «ApplicationId». Обратите внимание, что «Назначено», «Обрабатывается», .. являются полями статуса.

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Проверьте этот пример .. как будто я реализовал, используя этот. Вы можете создать свои динамические столбцы / динамический свод. но вы должны использовать execute на сервере SQL.

Вы можете реализовать / изменить свой запрос, как хотите.

Ссылка: Сводки с динамическими столбцами в SQL Server 2005

DECLARE @query NVARCHAR(4000) SET @query = N'SELECT tID, '+ @cols +' FROM (SELECT  t2.tID
      , t1.ColName
      , t2.Txt FROM    Table1 AS t1
        JOIN Table2 AS t2 ON t1.ColId = t2.ColID) p PIVOT ( MAX([Txt]) FOR ColName IN ( '+ @cols +' ) ) AS pvt ORDER BY tID;'

Executing this with

EXECUTE(@query)

Для получения дополнительной информации об этом:
SQL Server - динамическая таблица PIVOT - SQL-инъекция
Динамический запрос PIVOT для кросс-таблицы
Динамическое вращение в SQL Server - в нем содержится пример, несколько соответствующий вашим требованиям.

Надеюсь, это поможет ..

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

Вы можете сделать это, используя немного DATEDIFF и PIVOT. Вот так ...

select name, max(DAY_1) as DAY_1, max(DAY_2) as DAY_2, max(DAY_3) as DAY_3, max(DAY_4) as DAY_4, max(DAY_5) as DAY_5 from (
SELECT s.value_Date, name, end_datetime,
'DAY_' + cast( DATEDIFF(DAY, dates.value_date, today.value_date) as varchar) as day
FROM schema1.VW_SKY_BATCH_STATUS S
CROSS JOIN (select top 1 VALUE_DATE from schema2.BUSINESS_DATE where CALENDAR = 'london' order by VALUE_DATE desc) as today
JOIN (select top 6 VALUE_DATE from schema2.BUSINESS_DATE where CALENDAR = 'london' order by VALUE_DATE desc) dates on dates.VALUE_DATE = s.VALUE_DATE
JOIN Reports.REPORT_DESCRIPTION rd on rd.ID = s.PROFILE_ID)
AS SourceTable
PIVOT (MAX(end_datetime) FOR day IN (DAY_1, DAY_2, DAY_3, DAY_4, DAY_5)) AS pt 
GROUP BY name
...