根据sql中的列值将多行投影到一行中

时间:2015-02-03 18:02:10

标签: sql

我想知道如何将多个相关行投影到一行中,例如,多个部分的产品将具有多个SKU,但我想将多个部分投影到一行中。

我确信这是可能的,但很难定义查询以获得所需的结果。

给出示例数据集

enter image description here

我想将结果投射到以下

enter image description here

产品代码或产品名称列中的内容无关紧要,基本上我只需要一行代表这两行。

我将如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

这取决于ProductCode和ProductName中存储的数据格式。 根据这个,你必须编写适当的表达式来提取所有有用的数据。 然后,当然,你必须决定你将为新行留下什么ID。

在我的例子中,我使用substr(...)进行简单的转换以提取必要的数据, 我使用max(ID)来选择该行的ID。

测试数据:

insert table1(CustId, ProductCode, ProductName)
values
    (10, 'Prod1Part1', 'Product1 Part1'),
    (10, 'Prod1Part2', 'Product1 Part2'),
    (10, 'Prod1Part3', 'Product1 Part3'),
    (10, 'Prod2Part1', 'Product2 Part1'),
    (10, 'Prod2Part2', 'Product2 Part2')
;

查询:

SELECT 
    (SELECT 
            MAX(id)
        FROM
            table1
        WHERE
            SUBSTR(ProductCode, 1, 5) = NewProductCode) id,
    CustId,
    NewProductCode,
    NewProductName
FROM
    (SELECT DISTINCT
        CustId, SUBSTR(ProductCode, 1, 5) NewProductCode,
        substr(ProductName, 1, instr(ProductName, ' ')) NewProductName
    FROM
        table1) x

输出:

8   10  Prod1   Product1 
10  10  Prod2   Product2 

清楚吗?如果不是,请让我改进答案。