2010-06-24 45 views
1

我要为列而非行即透视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 

宠物的名字来自查找表可以有任意数量的宠物但我只想返回前三名。

这是我的查询:

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; 

遗憾的是它只为每一行返回null ...所以我看到的输出是

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

希望这是一个普遍的问题,必须有人已经解决了它。

感谢

+2

跆拳道是SQL Server 2010的?最新版本是2008 R2。 – 2010-06-24 22:48:08

+0

注意:我的答案假设您在跟踪Brent Ozar调用20​​08 R2 SQL Server 2010! http://www.brentozar.com/archive/2009/02/sql-server-2010-features-leaked/ – 2010-06-25 08:36:21

+0

:)是的,它的确如此。 – sfomate 2010-06-28 16:28:29

回答

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 2010-06-28 16:27:27

+0

这有助于现在解决问题,稍后我会处理独特的设置。 – sfomate 2010-06-28 17:23:42