具有各自值的多列到行

Posted

技术标签:

【中文标题】具有各自值的多列到行【英文标题】:Multiple Columns to Row with respective values 【发布时间】:2020-08-08 20:56:34 【问题描述】:

试图将多列合并为行。预期的结果是

这是我尝试过的示例数据。如果整体速度更快,我也愿意接受 unpivot。完整的数据有 15 个 AttributeID、AttributeData 列。

DROP TABLE Attribute;

CREATE TABLE Attribute 
(
        Producttitle varchar(200),  
        AttributeID_1 varchar(50),  
        AttributeData_1 varchar(50), 
        AttributeID_2   varchar(50),
        AttributeData_2 varchar(50),
        AttributeID_3 varchar(50),  
        AttributeData_3 varchar(50)
);

INSERT INTO Attribute 
VALUES ('title1', '3145', 'Specific', '30', 'Yes', '40', 'Pink')

INSERT INTO Attribute 
VALUES ('title2', '17', 'Stainless', '19', 'smoke', '19', 'Something');

SELECT
    Producttitle, 
    [AttributeID],
    [AttributeData] 
FROM
    Attribute
CROSS APPLY
    (SELECT 'Indicator1', [AttributeID_1] UNION ALL
     SELECT 'Indicator2', [AttributeID_2] UNION ALL
     SELECT 'Indicator3', [AttributeID_3]) c (indicatorname, [AttributeID])
CROSS APPLY
    (SELECT 'Indicator1', [AttributeData_1] UNION ALL
     SELECT 'Indicator2', [AttributeData_2] UNION ALL
     SELECT 'Indicator3', [AttributeData_3]) d (indicatorname, [AttributeData]);

【问题讨论】:

您是否已经有了可行的解决方案,并且正在寻找更快的实施方案? 我还没有可行的解决方案。我通过上述查询得到的结果重复了所有内容。 【参考方案1】:

您可以使用cross apply 取消透视您的数据集。使用values() 会简单得多:

select a.title, x.*
from attribute a
cross apply (values
    (a.attributeId_1, a.attributeData_1),
    (a.attributeId_2, a.attributeData_2),
    (a.attributeId_3, a.attributeData_3)
) as x(attributeId, attributeData)

请注意,这是因为两组列具有一致的数据类型 - 否则需要额外的转换。

【讨论】:

【参考方案2】:

GMB 的解决方案确实很酷,但基本的联合也可以:

SELECT Producttitle, AttributeID_1 AttributeID, AttributeData_1 AttributeData
from attribute
union
SELECT Producttitle, AttributeID_2 AttributeID, AttributeData_2 AttributeData
from attribute
union
SELECT Producttitle, AttributeID_3 AttributeID, AttributeData_3 AttributeData
from attribute

【讨论】:

以上是关于具有各自值的多列到行的主要内容,如果未能解决你的问题,请参考以下文章

具有多列值的 DataView 的 RowFilter

多列,多表列到行 unpivot

基于具有列表值的多列删除数据框中的重复行[重复]

Pandas:在多列中查找具有匹配值的行的 Pythonic 方法(分层条件)

R中具有多个mu值的多列的单样本T检验

基于多列值的具有重复键的两个大型 Pandas DataFrame 的条件合并/连接 - Python