TSQL行到列

时间:2013-05-06 21:59:09

标签: sql-server tsql pivot

我有以下表结构

CREATE TABLE #T1
(
    UniqueID varchar(100),
    DrivingFld INT,
    ColumnFld varchar(10)
)

从这个表中,基于DrivingFld字段值,我希望ColumnFld的输出位于不同的列中。 Minir of DirvingFld的columnFld值应该在第一列中,或者应该在第二列中。

每个UniqueID最多可以有2行或1行

INSERT INTO #T1 VALUES('1',1,'Val1')
INSERT INTO #T1 VALUES('1',2,'Val2')
INSERT INTO #T1 VALUES('2',5,'ValX1')
INSERT INTO #T1 VALUES('2',10,'ValY2')
INSERT INTO #T1 VALUES('3',5,'XVal1')
INSERT INTO #T1 VALUES('4',10,'XVal22')
INSERT INTO #T1 VALUES('4',5,Null)

SELECT * FROM #T1

--Expected Results
--UniqueID, Column1, Column2
--1 Val1 Val2
--2 ValX1 ValY2
--3 XVal1 Null
--4 Null XVal22

1 个答案:

答案 0 :(得分:2)

有几种方法可以将数据从行旋转到列中。

您可以使用带有CASE表达式的聚合函数:

select uniqueid,
  max(case when rn = 1 then ColumnFld end) Col1,
  max(case when rn = 2 then ColumnFld end) Col2
from
(
  SELECT uniqueid, ColumnFld,
    row_number() over(partition by uniqueid
                      order by ColumnFld) rn
  FROM #T1
) d
group by uniqueid;

请参阅SQL Fiddle with Demo

或者如果您的数据库具有该功能,则可以使用PIVOT函数来获得结果:

select uniqueid, Col1, Col2
from
(
  SELECT uniqueid, ColumnFld,
    'Col'+cast(row_number() over(partition by uniqueid
                                  order by ColumnFld) as varchar(10)) col
  FROM #T1
) d
pivot
(
  max(ColumnFld)
  for col in (Col1, Col2)
) piv;

请参阅SQL Fiddle with Demo