Sql server 以SQL Server 2010为中心
我想将每个员工的前三名宠物作为列而不是行返回,即Sql server 以SQL Server 2010为中心,sql-server,sql-server-2008,pivot,Sql Server,Sql Server 2008,Pivot,我想将每个员工的前三名宠物作为列而不是行返回,即 Owner_ID Pet -------------------- 1 Cat 1 Dog 1 Hamster 2 Cow 2 Sheep 3 Dog 将其转换为 Owner_ID Pet1 Pet2 Pet3 ------------------------------------- 1 Cat D
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;
不幸的是,它只为每一行返回null。。。所以我看到的结果是
Owner_ID Pet1 Pet2 Pet3
-------------------------------------
1 null null null
2 null null null
3 null null null
希望这是一个常见的问题,一定有人已经解决了
谢谢如果我正确理解了您的意思,您可以在查询中使用
行号()over(按所有者划分\u ID顺序…
,然后使用这些
下面是一个例子
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
WTF是SQL Server 2010吗?最新版本是2008 R2.NB:我的回答假设您正在跟随Brent Ozar拨打2008 R2 SQL Server 2010!我之前试过行号,但遇到的问题是,如果一个主人有两只猫,我就需要得到一个不同的行号,但行号不起作用。这有助于解决目前的问题,稍后我将处理唯一集。