2

我有以下表结构

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
4

1 回答 1

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

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

于 2013-05-06T22:11:22.430 回答