2013-05-06 57 views
2

我有以下表结构TSQL行到列

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

从该表的基础上,DrivingFld字段值,我想ColumnFld的输出是在不同的列。 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 

回答

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

+0

谢谢。这工作完美。 – Srini 2013-05-06 22:23:14