2015-12-18 2 views
5

Я пытаюсь PIVOT некоторые данные в таблице, но я не могу этого сделать, потому что я не нахожу способ сделать это, используя столбцы varchar. У меня есть эта таблица:Pivot Column of varchar

declare @table table(name VARCHAR(50) not null, occupation VARCHAR(MAX)) 

insert into @table values ('A','Doctor') 
insert into @table values ('B','Doctor') 
insert into @table values ('A','Professor') 
insert into @table values ('A','Singer') 
insert into @table values ('A','Actor') 

SELECT 

CASE WHEN occupation = 'Doctor' THEN NAME END AS Doctor, 
CASE WHEN occupation = 'Professor' THEN NAME END AS Professor, 
CASE WHEN occupation = 'Singer' THEN NAME END AS Singer, 
CASE WHEN occupation = 'Actor' THEN NAME END AS Actor 
FROM @table 

Выход:

Doctor Professor Singer Actor 
A NULL NULL NULL 
B NULL NULL NULL 
NULL A NULL NULL 
NULL NULL A NULL 
NULL NULL NULL A 

И Pivot я получаю этот выход:

select * from 
(
select name, occupation from @table) src 
pivot (
min(name) 
for occupation in ([Doctor],[Professor],[Singer],[Actor])) as pvt 

Doctor Professor Singer Actor 
A  A   A  A 

И мин/макс/функция Функция поворота дает мне возможность лишь частичного вывод, для функции count я получаю количество записей для врача, певца и т. д. Но мне нужны реальные строки, а не количество строк.

Что мне нужно это:

Doctor Professor Singer Actor 
A  A   A  A 
B  NULL  NULL NULL 

т.е. предположит, если мы имеем 5 имя для врачей, мы должны показать 5 записей для врача колонка.

ответ

2

Я нахожу это проще выразить в виде условной агрегации, используя порядковый номер генерируется с помощью `row_number():

select max(case when occupation = 'Doctor' then name end) as Doctor, 
     max(case when occupation = 'Professor' then name end) as Professor, 
     max(case when occupation = 'Singer' then name end) as Singer, 
     max(case when occupation = 'Actor' then name end) as Actor  
from (select t.*, 
      row_number() over (partition by occupation order by name) as seqnum 
     from @table t 
    ) t 
group by seqnum 
order by seqnum; 
+0

Спасибо! :). Но заказ не заказывается в порядке возрастания для других записей, на самом деле мне нужно заказать все столбцы по возрастанию, поэтому я отдал приказ 1,2,3,4 – MAX

+0

@max. , , Если вы хотите, чтобы имена были в порядке возрастания, используйте 'order by name' в разделе' order by' для 'row_number()'. –

+0

Я чувствовал, что мы можем сделать это с помощью row_number(), и на самом деле я также написал дополнительный запрос. Но я не знал, чтобы объединить и оператор case внешнего и фактического столбца с rowid внутреннего запроса. – MAX

1

Вы можете использовать PIVOT, как вы предложили, просто добавить столбец с ROW_NUMBER:

SELECT [Doctor],[Professor],[Singer],[Actor] 
FROM (SELECT name, occupation, 
      rn = ROW_NUMBER() OVER (PARTITION BY occupation ORDER BY occupation) 
     FROM @table) AS src 
PIVOT (
    MIN(name) 
    FOR occupation IN ([Doctor],[Professor],[Singer],[Actor]) 
) AS pvt 

LiveDemo

Выход:

╔════════╦═══════════╦════════╦═══════╗ 
║ Doctor ║ Professor ║ Singer ║ Actor ║ 
╠════════╬═══════════╬════════╬═══════╣ 
║ A  ║ A   ║ A  ║ A  ║ 
║ B  ║   ║  ║  ║ 
╚════════╩═══════════╩════════╩═══════╝ 

EDIT:

Вы не писали, как обрабатывать больше строк, поэтому рассмотрим этот случай. Над решением будет возвращать:

╔════════╦═══════════╦════════╦═══════╗ 
║ Doctor ║ Professor ║ Singer ║ Actor ║ 
╠════════╬═══════════╬════════╬═══════╣ 
║ A  ║ A   ║ A  ║ A  ║ 
║ B  ║   ║ C  ║  ║ 
╚════════╩═══════════╩════════╩═══════╝ 

против:

╔════════╦═══════════╦════════╦═══════╗ 
║ Doctor ║ Professor ║ Singer ║ Actor ║ 
╠════════╬═══════════╬════════╬═══════╣ 
║ A  ║ A   ║ A  ║ A  ║ 
║ B  ║   ║  ║  ║ 
║  ║   ║ C  ║  ║ 
╚════════╩═══════════╩════════╩═══════╝ 

Если вы хотите второй случай использования:

SELECT [Doctor],[Professor],[Singer],[Actor] 
FROM (SELECT name, occupation, 
      rn = DENSE_RANK() OVER (ORDER BY Name) 
     FROM @table) AS src 
PIVOT (
    MIN(name) 
    FOR occupation IN ([Doctor],[Professor],[Singer],[Actor]) 
) AS pvt 

LiveDemo2

+1

Hi @ lad2025, Nice сообщение. На самом деле мне нужны все столбцы, которые нужно заказать по возрастанию – MAX

+0

@max См. Обновленный – lad2025

+0

спасибо @ lad2025 Жаль, что я пытаюсь заказать по внешнему запросу – MAX