Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 以SQL Server 2010为中心_Sql Server_Sql Server 2008_Pivot - Fatal编程技术网

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!我之前试过行号,但遇到的问题是,如果一个主人有两只猫,我就需要得到一个不同的行号,但行号不起作用。这有助于解决目前的问题,稍后我将处理唯一集。