【问题标题】:Transpose rows to columns将行转置为列
【发布时间】:2012-06-10 17:46:36
【问题描述】:

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

表_1

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

表_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

谢谢

【问题讨论】:

  • Pivot 是你想要的,但很困惑 table_1 适合你的问题
  • Table_1 是从哪里来的?从您有限的问题来看,似乎只需要 Table_2 中的数据(哎呀,浏览器延迟显示 Tony 的评论)
  • “最好”是什么意思?如果客户 1 在 1 月 12 日和 2 月 15 日达到状态 1,你想要哪一个?最新的?

标签: sql-server-2008-r2 transpose


【解决方案1】:

假设您知道只有四个可能的状态值,并且您想要任何 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

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

【讨论】:

  • 抱歉第一个表是我需要加入的。
  • @user1445542 在这种情况下,您需要重新编写您的 OP(原始帖子),因为您所问的没有意义......事实上,到目前为止所有回复都质疑这一点的 Table_1 强调了这一点。
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2023-03-27
  • 2019-08-04
  • 2021-03-30
相关资源
最近更新 更多