2014-12-29 5 views
-1

У меня есть тестовая база данных SQL следующий запрос:Dynamic Pivot - SQL Server

USE DataBase1 

Select Data.MonthDate, 
    Data.AccountID, 
    Data.MonthID, 
    Data.Sales, 
    Data.AccountName 
From Test1 as Data with(nolock) 

То, что я должен поворачиваться на основе от колонки продаж. Проблема заключается в том, что месяцы, когда я запускаю этот запрос, всегда будут меняться (хотя их всегда будет 4), и их нужно упорядочить слева направо/oldest-newest в сворачиваемом результате, основанном на столбце MonthDate. Первоначальный возврат при выполнении запроса выглядит следующим образом:

enter image description here

И конечный результат должен выглядеть следующим образом:

enter image description here

Я использую Excel здесь, чтобы продемонстрировать и я подчеркнули 0, потому что это технически значения NULL, но мне нужно, чтобы они возвращались как 0.

Я использую SQL Server Management Studio и фактическую базу данных, я буду запускать это снова st - более 200 000 строк.

Любые мысли?

Спасибо,

Джошуа

+0

Вы можете создать скрипт sql со всеми этими тестовыми данными? –

+1

Вы пробовали что-нибудь, написав sql? – Avijit

ответ

2

Использование Dynamic Query.

DECLARE @col_list VARCHAR(max)='', 
     @sel_list VARCHAR(max)='', 
     @sql  NVARCHAR(max) 

SELECT DISTINCT @col_list += '[' + Isnull(MonthID, '') + '],' 
FROM Test1 
ORDER BY MonthID 

SELECT @col_list = LEFT(@col_list, Len(@col_list) - 1) 

SELECT DISTINCT @sel_list += 'Isnull([' + Isnull(MonthID, '') + '],0) ' + '['+ MonthID + '],' 
FROM Test1 
ORDER BY MonthID 

SELECT @sel_list = LEFT(@sel_list, Len(@sel_list) - 1) 

SET @sql ='select Data.AccountID,Data.AccountName,'+ @sel_list+ ' from (
       Select 
       Data.AccountID, 
       Data.MonthID, 
       Data.Sales, 
       Data.AccountName 
       From Test1 as Data) A 
       pivot (sum(Sales) for monthid in('+ @col_list + ')) piv' 

--PRINT @sql 
EXEC Sp_executesql @sql 
1

В основном вам нужно динамически создавать запрос PIVOT и использовать sp_exec, чтобы запустить его. SQL Server, из коробки, не поддерживает динамические постоянно изменяющиеся столбцы, поскольку столбцы должны быть определены в запросе PIVOT.

Вот пример того, как это сделать: http://sqlhints.com/tag/dynamic-pivot-column-names/