将多个指标列分解为 2 个不同的列,并引入一个标签来跟踪两列的列名

Posted

技术标签:

【中文标题】将多个指标列分解为 2 个不同的列,并引入一个标签来跟踪两列的列名【英文标题】:unpivot multiple metric columns into 2 different columns and introduce a label to track column name for both columns 【发布时间】:2013-12-12 11:58:55 【问题描述】:

来源

id  value_a1    value_a2    value_a3    value_a4    value_b1    value_b2    value_b3    value_b4

1     1            1          1           1           1            1           1    
2     1            1          1           1           1            1           1    
3     1            1          1           1           1            1           1        

目标

id  value1  value1label value2  value2label
1    1      value_a1      1      value_b1
1    1      value_a2      1      value_b2
1    1      value_a3      1      value_b3
1    1      value_a4      1      value_b4
2    1      value_a1      1      value_b1
2    1      value_a2      1      value_b2
2    1      value_a3      1      value_b3
2    1      value_a4      1      value_b4
3    1      value_a1      1      value_b1
3    1      value_a2      1      value_b2
3    1      value_a3      1      value_b3
3    1      value_a4      1      value_b4

我写了一个查询:

SELECT ID value1,
       value1label,
       value2,
       value2label,
FROM
  (SELECT id,
          valuea1,
          valuea2,
          valuea3,
          valuea4,
          valueb1,
          valueb2,
          valueb3,
          valueb4
   FROM TABLE) P UNPIVOT (value1
                          FOR value1label IN (valuea1,valuea2,valuea3,valuea4))AS UNPVT UNPIVOT (value2
                                                                                                 FOR value2label IN (valueb1,valueb2,valueb3,valueb4))AS UNPVT1

但问题是 value1label 和 value2label 不像 a1 到 b1 那样同步,并且在任何一个上使用 order 都会破坏排序。 如果我在 value1label 上订购它从 a1 然后 b1 然后 b2,b3 等等。

对每个标签使用带有 unpivot 值的联合也会导致空值,因为它会增加行数,所以这是不希望的

任何人都可以帮助我解决这个问题

p.s 将 a1,a2,a3,a4 视为 value_a1,value_a2,value_a3,value_a4 的列标题的别名 b1,b2,b3,b4 也是如此 为简单起见,我选择了这些值。

【问题讨论】:

有人有办法解决吗?? 【参考方案1】:

您没有指定正在使用的 SQL Server 版本,但您可以使用 CROSS APPLY 而不是 UNPIVOT 来取消透视数据对 value_a1/value_b1

如果您使用的是 SQL Server 2008+,那么您可以将 VALUES 子句与 CROSS APPLY 一起使用,但您也可以使用 UNION ALL:

select id, value1, value1label, value2, value2label
from yourtable
cross apply
(
  select value_a1, 'value_a1', value_b1, 'value_b1' union all
  select value_a2, 'value_a2', value_b2, 'value_b2' union all
  select value_a3, 'value_a3', value_b3, 'value_b3' union all
  select value_a4, 'value_a4', value_b4, 'value_b4'
) c (value1, value1label, value2, value2label);

见SQL Fiddle with Demo。这会将您的数据放入您需要的相同行中:

| ID | VALUE1 | VALUE1LABEL | VALUE2 | VALUE2LABEL |
|----|--------|-------------|--------|-------------|
|  1 |      1 |    value_a1 |      1 |    value_b1 |
|  1 |      1 |    value_a2 |      1 |    value_b2 |
|  1 |      1 |    value_a3 |      1 |    value_b3 |
|  1 |      1 |    value_a4 |      1 |    value_b4 |

【讨论】:

啊,这很有帮助,但我做了其他事情,至于 sql server 版本,它是 2008 R2...非常感谢您提供替代方案。

以上是关于将多个指标列分解为 2 个不同的列,并引入一个标签来跟踪两列的列名的主要内容,如果未能解决你的问题,请参考以下文章

将列表的列分解为多行

将 DataFrame 的列设置为 FacetGrid 图形的行

Sparklyr:如何将列表列分解为Spark表中自己的列?

如何将包含多个键值对的列拆分为pyspark中的不同列

使用 Spark Dataframe scala 将多个不同的列转换为 Map 列

将稀疏特征向量分解为单独的列