【问题标题】:How to transpose rows to columns in SQL SERVER without creating staging table如何在不创建临时表的情况下将行转换为 SQL SERVER 中的列
【发布时间】:2021-08-21 13:26:20
【问题描述】:

请帮我转置下表,而不创建临时表。尝试 PIVOT 但失败了。任何建议也会有所帮助。谢谢!

现有表:

TIME Value
4/8/2020 5:18 1
4/8/2020 5:22 0
4/8/2020 7:22 1
4/8/2020 7:31 0
4/9/2020 1:44 1
4/9/2020 1:50 0

期望的结果:

1 0
4/8/2020 5:18 4/8/2020 5:22
4/8/2020 7:22 4/8/2020 7:31
4/9/2020 1:44 4/9/2020 1:50

【问题讨论】:

  • PIVOT 是如何“失败”的?我建议你做更多的研究并再次尝试PIVOT。这绝对是您想要做的。
  • 有什么建议或链接可以参考吗?请分享
  • 是的,我已经在我的原始评论中包含了一个链接作为起点。
  • PIVOT 失败,因为时间列上的聚合函数 MAX() 或 MIN() 仅从预期结果返回 1 行。有什么建议吗?
  • 我建议尝试下面 Gordon Linoff 的答案。

标签: sql sql-server tsql pivot-table transpose


【解决方案1】:

结合ROW_NUMBER窗口函数和PIVOT试试这个解决方案:

SELECT [0], [1]
FROM 
(
  SELECT Value, TIME, ROW_NUMBER() OVER (PARTITION BY Value ORDER BY TIME) Rb
  FROM MyTable
) AS SourceTable
PIVOT
(
  MAX(TIME)
  FOR Value IN ([0], [1])
) AS PivotTable

【讨论】:

    【解决方案2】:

    你可以枚举它们并聚合:

    select max(case when value = 1 then time end) as value_1,
           max(case when value = 0 then time end) as value_0
    from (select t.*,
                 row_number() over (partition by value order by time) as seqnum
          from t
         ) t
    group by seqnum;
    

    【讨论】:

    • 谢谢!它也有效。但不能将两个答案都标记为已解决。
    • @MamunurRashid 。 . .这比另一个答案早了 16 分钟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    相关资源
    最近更新 更多