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