簡體   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