将多个指标列分解为 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表中自己的列?