2016-02-11 6 views
0

я таблица называется продаж с тремя колонками SalesCountry, SalesState и SalesMan, как показано ниже:SQL Server 2008 R2: Динамический запрос поворота

Таблица:

create table sales 
(
    SalesCountry varchar(20), 
    SalesState varchar(20), 
    SalesMan varchar(20) 
); 

Вставка:

insert into sales values('USA','TEXAS','Mak'); 
insert into sales values('USA','California','Sam'); 
insert into sales values('Cannada','Alberta','John'); 
insert into sales values('Cannada','Manitoba','John'); 

Теперь я хочу показать t он приводит следующим образом:

County  State1  State2  SalesMan1 SalesMan2 
--------------------------------------------------------- 
USA   TEXAS  California Mak   Sam 
Cannada  Alberta  Manitoba John  NULL 

Примечание: Запрос поворота должен быть динамичным, который должен показать столбцы согласно строк в таблице с приращением значения 1 с именем столбца, как я показал State1,State2 там может be State3,State4,,,,,,n. В моем примере есть только четыре строки, может быть и больше.

+0

Возможный дубликат [SQL Server: динамический шарнирный более 5 столбцов] (http://stackoverflow.com/questions/18657214/sql-server-dynamic-pivot- over-5-columns) –

+0

Как будет конечный результат, если мы: «вставляем в значения продаж (« США »,« Калифорния »,« Джон »); будет ли он создавать столбцы SalesMan3? а также «вставить в стоимостные ценности (« США »,« Канзас »,« Мак »); – armen

ответ

0

с помощью PIVOT мы можем достичь этого

DECLARE @sales table 
    (
     SalesCountry varchar(20), 
     SalesState varchar(20), 
     SalesMan varchar(20) 
    ); 

    insert into @sales values('USA','TEXAS','Mak'); 
    insert into @sales values('USA','California','Sam'); 
    insert into @sales values('Cannada','Alberta','John'); 
    insert into @sales values('Cannada','Manitoba','John'); 

Select SalesCountry,MAX([1]) State1,MAX([2]) State2,MAX([Sales_1])[Sales_1],MAX([Sales_2])[Sales_2] FROM (
select 
SalesCountry, 
SalesState, 
SalesMan, 
ROW_NUMBER()OVER(PARTITION BY SalesCountry ORDER BY SalesCountry)RN , 
'Sales'+'_'+CAST(ROW_NUMBER()OVER(PARTITION BY SalesCountry ORDER BY SalesCountry) AS VARCHAR)RNN 
    FROM @sales 
    )T 
PIVOT (MAX(SalesState) for RN IN ([1],[2]))P 
PIVOT (MAX(SalesMan) for RNN IN ([Sales_1],[Sales_2]))PP 
GROUP BY PP.SalesCountry 
+0

Предполагается, что в стране будет только два продавца. Прочтите последнюю «заметку» в исходном вопросе. –

+0

, тогда мы должны пойти для динамического запроса @TabAlleman – mohan111

+0

Да, мы должны. Точно так же, как в дублированном вопросе, я заметил. –

Смежные вопросы