2010-06-24 2 views
1

Я хочу вернуться в тройку лучших домашних животных для каждого сотрудника в качестве столбцов вместо строк, т.е.Pivot на SQL Server 2010

Owner_ID Pet 
-------------------- 
1  Cat 
1  Dog 
1  Hamster 
2  Cow 
2  Sheep 
3  Dog 

преобразовать его в

Owner_ID Pet1 Pet2 Pet3 
------------------------------------- 
1   Cat Dog Hamster 
2   Cow Sheep null 
3   Dog null null 

Название домашних животных приходят из поиска стол и может быть любое количество домашних животных, но я только хочу, чтобы вернуть верхний 3.

Вот мой запрос:

SELECT Owner,Pet1, Pet2,Pet3 
    FROM 
    (select distinct OwnerID as Owner,glcom.Value as Pets 
    from Owner ,OwnerPets ,Pet  
    where Pet.Type='Furry' 
    and OwnerPets.OwnerID = OwnerID.OwnerID 
    and OwnerPets.PetID = Pet.PetID) AS SourceTable 
PIVOT 
( 
Max(Pets) 
FOR Pets IN (Pet1, Pet2,Pet3) 
) AS PivotTable; 

К сожалению, это только возвращает нуль для каждой строки ... поэтому выход я вижу

Owner_ID Pet1 Pet2 Pet3 
------------------------------------- 
1   null null null 
2   null null null 
3   null null null 

Надеется, что это общая проблема, и кто-то должны быть решены уже.

Благодаря

+2

WTF является SQL Server 2010? Последняя версия - 2008 R2. –

+0

NB: Мой ответ предполагает, что вы следуете за Brent Ozar при вызове 2008 R2 SQL Server 2010! http://www.brentozar.com/archive/2009/02/sql-server-2010-features-leaked/ –

+0

:) да, это так. – sfomate

ответ

2

Если я правильно вас понял, вы можете использовать ROW_NUMBER() over (partition by Owner_ID order by ...) по вашему запросу, то стержень с помощью тех.

Пример.

WITH Unpivoted AS 
(
SELECT X.*, ROW_NUMBER() over (partition by Owner_ID order by Pet) AS RN 
    FROM (VALUES 
(1,  'Cat') , 
(1,  'Dog') , 
(1,  'Hamster') , 
(1,  'Rhino'), 
(1,  'Zebra'), 
(2,  'Cow') , 
(2,  'Sheep') , 
(3,  'Dog') 
) AS X (Owner_ID, Pet) 
) 

SELECT Owner_Id, [1] AS Pet1, [2] AS Pet2,[3] AS Pet3 FROM Unpivoted 
PIVOT 
( 
Max(Pet) 
FOR RN IN ([1], [2],[3]) 
) AS PivotTable; 

Возвращает

Owner_Id Pet1 Pet2 Pet3 
----------- ------- ------- ------- 
1   Cat  Dog  Hamster 
2   Cow  Sheep NULL 
3   Dog  NULL NULL 
+0

Я пробовал номер строки раньше, но проблема, с которой я столкнулся, - это если у владельца две кошки, мне нужно получить отчетливое число и номер строки, который не работает. – sfomate

+0

Это помогает решить проблему на данный момент, я буду иметь дело с уникальными наборами позже. – sfomate