【问题标题】:Partial transpose of rows to columns行到列的部分转置
【发布时间】:2015-03-09 16:33:50
【问题描述】:

问题很simple,但是实现起来有点麻烦。

当前表格如下所示:

ID  Value

A   1
A   2
A   3
B   1
B   2
C   1

我需要这样的:

ID Value1 Value2 Value3 Value...
A   1      2      3      NULL
B   1      2      NULL   NULL
C   1     NULL    NULL   NULL

【问题讨论】:

    标签: sql tsql sql-server-2014


    【解决方案1】:

    如果值列是已知\合理的设置范围,即 1-5,您可以执行以下操作:

    Select ID, 
        MAX(CASE WHEN Value = 1 Then 1 Else Null End) as Value1,
        MAX(CASE WHEN Value = 2 Then 2 Else Null End) as Value2,
        MAX(CASE WHEN Value = 3 Then 3 Else Null End) as Value3,
        MAX(CASE WHEN Value = 4 Then 4 Else Null End) as Value4,
        MAX(CASE WHEN Value = 5 Then 5 Else Null End) as Value5
    From Table
    Group By ID
    

    如果您一开始不知道列的数量,即它们是动态的,那么您将不得不编写一个动态的 sql 数据透视表。有很多堆栈示例显示了这一点:

    【讨论】:

    • 嗨,谢谢你,但作为一个新手,我仍然无法掌握这一点。问题是我的例子真的被简化了。 ID 和 Value 字段基本上是随机字符串。所以对于 id 22845,Value1 可以是 1323jk3432 和 value2 ddffjedi772。所以我不能在 value = 时使用 case。我知道最多有 10 个值列。因此,简单来说,查询应该将 ID1 的第一个值输入到 Value1 字段中。之后,下一个进入 Value2,如果它还没有在 Value1 中。也许用count,我真的不知道。
    • 所以你的列是随机的,在这种情况下你需要做一个动态的透视。检查我给你的链接的例子
    【解决方案2】:

    好的,在你的帮助和朋友的帮助下,我解决了这个问题。

    Select ROW_NUMBER() 
            OVER (PARTITION BY Field1 
            ORDER BY Field1) 
            AS order_num, Field1, Value
    into #tab1
    from Source_Table
    Order by Field1
    
    
    Select * 
    from #tab1
        PIVOT
            (Max(Value)  
                FOR order_num IN ([1], [2], [3], [4], [5])) AS PVT
    
    
    drop table #tab1
    

    我仍然需要完全理解它是如何工作的,但它确实有效。我希望它也对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多