繁体   English   中英

SQL Server:将行转置为列

[英]SQL Server : Transpose rows to columns

我正在尝试转置数据。 列数不固定(即选定的 ShiftNames 不固定)。 这是我的输入数据。

Date_time   ShiftName     Consumption
28-07-2016  Shift 1       20
28-07-2016  Shift 2       21
28-07-2016  Shift 3       22
29-07-2016  Shift 1       30
29-07-2016  Shift 2       31
29-07-2016  Shift 3       32
30-07-2016  Shift 1       40
30-07-2016  Shift 2       41
30-07-2016  Shift 3       42

输出将是这样的

Shift 1      Shift 2    Shift 3   Date_Time
20           21         23        28-07-2016
30           31         32        29-07-2016
40           41         42        30-07-2016  

你可以用一个枢轴来做到这一点。 下面是一个例子:

测试数据:

DECLARE @temp TABLE(Date_time varchar(100), ShiftName VARCHAR(100),    Consumption INT)

INSERT INTO @temp
VALUES
('28-07-2016','Shift 1',20),
('28-07-2016','Shift 2',21),
('28-07-2016','Shift 3',22),
('29-07-2016','Shift 1',30),
('29-07-2016','Shift 2',31),
('29-07-2016','Shift 3',32),
('30-07-2016','Shift 1',40),
('30-07-2016','Shift 2',41),
('30-07-2016','Shift 3',42)

枢:

SELECT
    *
FROM
(
    SELECT
        Date_time,
        ShiftName,
        Consumption
    FROM
        @temp
) AS sourceTable
PIVOT
(
    SUM(Consumption)
    FOR ShiftName IN ([Shift 1],[Shift 2],[Shift 3])
) AS pvt

结果:

Date_time     Shift 1   Shift 2   Shift 3
28-07-2016    20        21        22
29-07-2016    30        31        32
30-07-2016    40        41        42

参考:

由于 shiftName 是动态的,请使用此动态查询

DECLARE @cols AS NVARCHAR(MAX), @query  AS NVARCHAR(MAX)
 SELECT 
 @cols = STUFF((SELECT distinct ',' + QUOTENAME(ShiftName )
 FROM 
#temp       
FOR XML PATH(''), TYPE  
).value('.', 'NVARCHAR(MAX)'),1,1,'')

SET @query = 'SELECT *  FROM   
 (
  SELECT * FROM #temp
  ) x  
PIVOT
(  
   Sum(consumption)
 FOR ShiftName IN (' + @cols + ')  
) p '

EXECUTE(@query);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM