sql server中的unpivot对

时间:2014-06-11 09:03:08

标签: sql sql-server unpivot

我有一个包含以下数据结构和数据的表。

declare @temp table 
 ( 

  Name nvarchar(500),
  Class1 decimal(18,2), 
  Class1P decimal(18,2),  
  Class1S decimal(18,2),
   Class2 decimal(18,2), 
  Class2P decimal(18,2),  
  Class2S decimal(18,2),
   Class3 decimal(18,2), 
  Class3P decimal(18,2),  
  Class3S decimal(18,2)
  )

INSERT INTO @temp 
  SELECT 'Rahul',101,102,103,201,202,203,301,302,303

现在,它以简单的select语句以这种形式向我显示数据。

simple select statement result

但我希望以这种格式显示数据。我知道我必须首先取消数据,然后需要转动数据,但面临与unpiovt和pivot的语法问题。

expected result

2 个答案:

答案 0 :(得分:3)

您没有指定正在使用的SQL Server版本,但由于您需要取消对列的对,您可以使用CROSS APPLY

select 
  t.Name,
  c.Class, 
  c.Class1P, 
  c.Class1S
from @temp t
cross apply
(
  values
    (Class1, Class1P, Class1S),
    (Class2, Class2P, Class3S),
    (Class3, Class3P, Class3S)
) c (Class, Class1P, Class1S);

SQL Fiddle with Demo。以上使用SQL Server 2008中提供的VALUES,如果您使用的是SQL Server 2005,则可以将VALUES替换为SELECT...UNION ALL

答案 1 :(得分:1)

无需转动。只需将3个单独的查询结合在一起......

declare @temp table 
 ( 

  Name nvarchar(500),
  Class1 decimal(18,2), 
  Class1P decimal(18,2),  
  Class1S decimal(18,2),
  Class2 decimal(18,2), 
  Class2P decimal(18,2),  
  Class2S decimal(18,2),
  Class3 decimal(18,2), 
  Class3P decimal(18,2),  
  Class3S decimal(18,2)
  )

INSERT INTO @temp 
  SELECT 'Rahul',101,102,103,201,202,203,301,302,303
INSERT INTO @temp 
  SELECT 'Eoin',701,702,703,801,802,803,901,902,903

SELECT Name, Class1 as Class, Class1P as ClassP, Class1S as ClassS FROM @temp
UNION
SELECT Name, Class2, Class2P, Class2S FROM @temp
UNION
SELECT Name, Class3, Class3P, Class3S FROM @temp

返回结果。

Name                 Class                                   ClassP                                  ClassS
-------------------- --------------------------------------- --------------------------------------- ---------------------------------------
Eoin                 701.00                                  702.00                                  703.00
Eoin                 801.00                                  802.00                                  803.00
Eoin                 901.00                                  902.00                                  903.00
Rahul                101.00                                  102.00                                  103.00
Rahul                201.00                                  202.00                                  203.00
Rahul                301.00                                  302.00                                  303.00