将行转置为列

时间:2012-06-10 17:46:36

标签: sql-server-2008-r2 transpose

将行转置为列的最佳方法是什么。

TABLE_1

Cust_id  field1  field2 ...
-------  ------  ------

TABLE_2

Cust_id  status  date_changed
-------  ------  ------------

查看/表格输出

Cust_id  status1      status2        status3      status4
-------  -----------  -------------  -----------  -----------
1        01-jan-2011  05-April-2011  06-Dec-2012  30-Dec-2012

由于

1 个答案:

答案 0 :(得分:0)

假设您知道只有四种可能的状态值,并且您希望任何cust_id / status组合的最新日期:

DECLARE @table_2 TABLE(Cust_id INT, status INT, date_changed DATE);

INSERT @table_2 VALUES
(1,1,SYSDATETIME()),
(2,1,SYSDATETIME()),
(3,1,DATEADD(DAY, 1, SYSDATETIME())),
(3,1,SYSDATETIME()),
(1,2,SYSDATETIME());

SELECT cust_id, 
    status1 = [1], status2 = [2], 
    status3 = [3], status4 = [4]
FROM 
(
  SELECT cust_id, status, date_changed
  FROM @table_2
) AS t
PIVOT (MAX(date_changed) 
FOR [status] IN ([1],[2],[3],[4])) AS p
ORDER BY cust_id;

结果:

cust_id status1    status2    status3 status4
------- ---------- ---------- ------- -------
1       2012-06-10 2012-06-10 NULL    NULL
2       2012-06-10 NULL       NULL    NULL
3       2012-06-11 NULL       NULL    NULL

这是执行此操作的标准方法。可能有更好的方法取决于您的目标和/或您是否事先知道潜在状态值的数量,或者只想显示存在的状态值的列。如果有任何这种情况适用,请更新问题。