Sql server TSQL行到列

Sql server TSQL行到列,sql-server,tsql,pivot,Sql Server,Tsql,Pivot,我有下面的表结构 CREATE TABLE #T1 ( UniqueID varchar(100), DrivingFld INT, ColumnFld varchar(10) ) 从这个表中,基于DrivingFld字段值,我希望ColumnFld的输出位于不同的列中。DivingFLD列FLD值的最小值应位于第一列或第二列 每个UniqueID最多可以有2行或1行 INSERT INTO #T1 VALUES('1',1,'Val1') INSERT INTO #T

我有下面的表结构

CREATE TABLE #T1
(
    UniqueID varchar(100),
    DrivingFld INT,
    ColumnFld varchar(10)
)
从这个表中,基于DrivingFld字段值,我希望ColumnFld的输出位于不同的列中。DivingFLD列FLD值的最小值应位于第一列或第二列

每个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

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

您可以将聚合函数与
大小写
表达式一起使用:

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;

或者,如果您的数据库具有该功能,则可以使用
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;