2016-11-19 9 views
2

У меня возникла сложность при разработке процедуры, которая выполняла бы поворот с заданным агрегатом на таблице, указанной ниже. Процедура должна динамически принять все записи из Sales.Month и сводной таблицы на него, используя заполнитель передается в порядке, так, например, если бы мы пройти SUM (передача с помощью VARCHAR, а затем EXEC на динамически созданный запрос) по продажам:Выполнение pivot без оператора PIVOT

Продажи:

Item Month Price 
------------------- 
Book  Jan 230 
Book  Jan 100 
Game  Jan  50 
Game  Feb  80 
Stick Mar 190 

Итоговые: ("повернуты")

Item  Jan Feb Mar 
------------------------ 
Book  330 null null 
Game  50 80 null 
Stick null null 190 

Я не могу придумать синтаксис, который позволит мне сделать это.

Редактировать заметку: Основная трудность здесь на самом деле «Не использовать» родной «PIVOT».

+2

Google : «Динамический стержень SQL Server». –

+0

Но я не могу использовать оператор PIVOT. С осью опоры было бы намного проще. – Ernio

+0

. , И почему вы не можете использовать 'pivot'? Кроме того, по слухам, условная агрегация, как правило, быстрее. –

ответ

4

Возможно, у меня есть подзапрос, чтобы сохранить столбцы месяца в правильном порядке. Кроме того, я, как правило, предпочитают условной агрегации, потому что легче добавить дополнительные столбцы (т.е. Grand Total)

Declare @Agg varchar(25) = 'SUM' -- Try Min, Max, Avg, ... 

Declare @SQL varchar(max)='' 
Select @SQL = @SQL+','+MMM+'='[email protected]+'(case when Month='''+MMM+''' then Price else null end)' 
From (Select MM,MMM From (Values(1,'Jan'),(2,'Feb'),(3,'Mar'),(4,'Apr'),(5,'May'),(6,'Jun'),(7,'Jul'),(8,'Aug'),(9,'Sep'),(10,'Oct'),(11,'Nov'),(12,'Dec')) M(MM,MMM)) A 
Where MMM in (Select Distinct Month from Yourtable) 
Order By MM 

Select @SQL='Select Item'[email protected]+' From Yourtable Group By Item' 
Exec(@SQL) 

Возвраты

Item Jan  Feb  Mar 
Book 330.00 NULL NULL 
Game 50.00 80.00 NULL 
Stick NULL NULL 190.00 

FYI: Динамический SQL Сформирован:

Select Item 
     ,Jan=SUM(case when Month='Jan' then Price else null end) 
     ,Feb=SUM(case when Month='Feb' then Price else null end) 
     ,Mar=SUM(case when Month='Mar' then Price else null end) 
From Yourtable 
Group By Item