【问题标题】:Pivot on SQL Server 2010以 SQL Server 2010 为中心
【发布时间】:2010-06-24 22:46:50
【问题描述】:

我想将每个员工的前三只宠物作为列而不是行返回,即

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 

希望这是一个常见问题,并且一定有人已经解决了。

谢谢

【问题讨论】:

标签: sql-server sql-server-2008 pivot


【解决方案1】:

如果我对您的理解正确,您可以在查询中使用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

【讨论】:

  • 我之前尝试过行号,但我遇到的问题是如果主人有两只猫,那么我需要一个不同的行号并且行号不起作用。
  • 这有助于暂时解决问题,稍后我将处理独特的集合。
猜你喜欢
  • 2017-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多