2013-05-30 5 views
0

У меня есть одна таблица UserRoleTable и имеет столбцы ID, JobId, ProjectManager, Engineer:SQL Server 2008 Pivot без агрегатных функций

**ID  JobId  Engg  Manager** 

001 1001  x   Null 
002 1002  Null  P 
003 1003  Y   Q 
004 1004  Z   Null 
005 1005  Null  J 

хочу результат в этом формате:

ID  JobId  Name  Role 

001 1001  x   Engg 
002 1002  P   Manager 
003 1003  Y   Engg 
003 1003  Q   Manager 
004 1004  Z   Engg 
005 1005  J   Manager 

Там нет первичных или внешних ключей.

Должен ли я использовать Pivot для этой функции?

+2

FYI Это скорее UNPIVOT с момента заголовка столбца становится значения. – AaronLS

ответ

7

Вы можете использовать CROSS APPLY и VALUES для UNPIVOT данные:

select id, jobid, 
    name, 
    role 
from UserRoleTable 
cross apply 
(
    values ('Engg', engg), ('Manager', Manager) 
) c (role, name) 
where name is not null; 

См SQL Fiddle with Demo

Или вы можете использовать UNPIVOT функцию:

select id, jobid, name, role 
from UserRoleTable 
unpivot 
(
    name 
    for role in (Engg, Manager) 
) unpiv; 

См SQL Fiddle with Demo

А вот UNION решение:

SELECT id, jobid, Engg AS name, 'Engg' AS role 
    FROM UserRoleTable 
    WHERE Engg IS NOT NULL 
    UNION ALL 
    SELECT id, jobid, Manager, 'Manager' 
    FROM UserRoleTable 
    WHERE Manager IS NOT NULL 
    ORDER BY id, role ; 

См SQL Fiddle with Demo

+0

@ user2438237 'PIVOT' является более элегантным из двух ответов. Я бы попробовал их с вашими наборами данных и посмотрел, у кого лучший профиль производительности. – swasheck

+0

@bluefeet: Thnks много. он работает отлично. Я не очень хорошо знаю команды cross apply, pivot, univot. Похоже, я должен их изучить. В любом случае спасибо. – user2438237

+0

@ user2438237 ... не говоря уже о логике обратного случая. – swasheck

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