首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将两行透视为两列

如何将两行透视为两列
EN

Stack Overflow用户
提问于 2019-03-01 06:01:03
回答 1查看 88关注 0票数 0

我有以下SQL查询:

代码语言:javascript
复制
select
    distinct

    Equipment_Reserved.Equipment_Attached_To,
    Equipment.Name
from
    Equipment,
    Studies,
    Equipment_Reserved
where
    Studies.Study = 'MAINT19-01'
    and
    Equipment.idEquipment = Equipment_Reserved.Equipment_idEquipment
    and
    Studies.idStudies = Equipment_Reserved.Studies_idStudies
    and
    Equipment.Type = 'Probe'

此查询将生成以下结果:

代码语言:javascript
复制
Equipment_Attached_To   Name
2297                    R1-P1
2297                    R1-P2
2299                    R1-P3

我想将其更改为以下内容:

代码语言:javascript
复制
Equipment_Attached_To   Name1     Name2
2297                    R1-P1     R1-P2
2299                    R1-P3     NULL

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

发布于 2019-03-01 08:49:28

我首先将您的查询从旧的遗留连接语法更改为显式连接,因为它使查询更容易理解:

代码语言:javascript
复制
SELECT
    DISTINCT

    Equipment_Reserved.Equipment_Attached_To,
    Equipment.Name
FROM
    Equipment
    INNER JOIN Equipment_Reserved ON Equipment_Reserved.Equipment_idEquipment = Equipment.idEquipment
    INNER JOIN Studies            ON Studies.idStudies = Equipment_Reserved.Studies_idStudies

WHERE
    Studies.Study = 'MAINT19-01'
    AND
    Equipment.Type = 'Probe'

我不认为您实际上需要一个PIVOT -我认为您可以使用带有ROW_NUMBER函数的嵌套查询来做到这一点。我发现PIVOT查询的查询执行计划通常比嵌套查询差。

让我们在整个查询中添加ROW_NUMBER (它需要一个ORDER BY,因为它是一个窗口函数)和一个匹配的ORDER BY,以使其保持一致。我们还可以使用PARTITION BY,这样它就可以重置每个行号的Equipment_Attached_To值:

代码语言:javascript
复制
SELECT
    DISTINCT
    Equipment_Reserved.Equipment_Attached_To,
    Equipment.Name,

    ROW_NUMBER() OVER (PARTITION BY Equipment_Attached_To ORDER BY [Name]) AS RowNumber

FROM
    Equipment
    INNER JOIN Equipment_Reserved ON Equipment_Reserved.Equipment_idEquipment = Equipment.idEquipment
    INNER JOIN Studies            ON Studies.idStudies = Equipment_Reserved.Studies_idStudies

WHERE
    Studies.Study = 'MAINT19-01'
    AND
    Equipment.Type = 'Probe'

ORDER BY
    Equipment_Attached_To,
    [Name]

这将产生如下输出:

代码语言:javascript
复制
Equipment_Attached_To   Name    RowNumber
2297                    R1-P1    1
2297                    R1-P2    2
2299                    R1-P3    1

然后可以将其拆分成显式列,如下所示。MAX()的使用是任意的(我们可以改用MIN() ),这只是因为我们处理的是GROUP BY,而且CASE WHEN...将输入集限制为只有1行。

代码语言:javascript
复制
SELECT
    Equipment_Attached_To,
    MAX( CASE WHEN RowNumber = 1 THEN [Name] END ) AS Name1,
    MAX( CASE WHEN RowNumber = 2 THEN [Name] END ) AS Name2
FROM
    (
        -- the query from above
    )
GROUP BY
    Equipment_Attached_To
ORDER BY
    Equipment_Attached_To,
    Name1,
    Name2

所以最后的查询是:

代码语言:javascript
复制
SELECT
    Equipment_Attached_To,
    MAX( CASE WHEN RowNumber = 1 THEN [Name] END ) AS Name1,
    MAX( CASE WHEN RowNumber = 2 THEN [Name] END ) AS Name2
FROM
    (
        SELECT
            DISTINCT
            Equipment_Reserved.Equipment_Attached_To,
            Equipment.Name,

            ROW_NUMBER() OVER (PARTITION BY Equipment_Attached_To ORDER BY [Name]) AS RowNumber

        FROM
            Equipment
            INNER JOIN Equipment_Reserved ON Equipment_Reserved.Equipment_idEquipment = Equipment.idEquipment
            INNER JOIN Studies            ON Studies.idStudies = Equipment_Reserved.Studies_idStudies

        WHERE
            Studies.Study = 'MAINT19-01'
            AND
            Equipment.Type = 'Probe'
    )
GROUP BY
    Equipment_Attached_To
ORDER BY
    Equipment_Attached_To,
    Name1,
    Name2
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54934938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档