2017-05-23 72 views
-1

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

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 

感谢。

+3

您是否尝试过的东西了吗? Google的“数据透视查询SQL”适用于初学者。 –

回答

2

你可以用一个数据透视表做到这一点。下面是一个例子:

测试数据:

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 

参考:

+0

谢谢..它工作正常。 – Milind

0

由于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);