【问题标题】:Combine output in SQL into single row将 SQL 中的输出合并为单行
【发布时间】:2015-08-03 19:09:34
【问题描述】:

我正在尝试编写一个使用 ID 选择一堆相关行的 SQL 查询。但是,我不想将每个关联项目都放在一行中,而是将它们连接成一行。

例如而不是:

ID    Item
1     a
2     b
1     c

我想要:

ID    Item 1    Item 2    ...
1     a         c
2     b

目前我正在使用一个简单的查询,但不知道如何做到这一点:

Select
    Investigation.ID,
    Record.Item
FROM 
    Investigation
INNER JOIN 
    Record
    ON Investigation.ID = Record.Inv_Id

这个查询是一个更大的查询的一部分,它涉及多个连接和一个联合。最终,这将全部转换为 XML,格式可能类似于以下内容:

<investigation>
    <id>1</id>
    <name>something</name>
    <items>
        <item>a</item>
        <item>c</item>
    </items>
<investigation>
<investigation>
    <id>2</id>
    <name>something else</name>
    <items>
        <item>b</item>
    </items>
</investigation>

【问题讨论】:

  • 我不完全确定,但这看起来像是一个支点。
  • 请看下面的问题。它使用 PIVOT 并将获得您需要的结果。如果您的值并不总是已知,还解释了如何创建动态数据透视语句。 stackoverflow.com/questions/11617713/…
  • 我会稍微担心一下性能,因为它必须是一个包含在已经很复杂的 sql 查询中的动态枢轴。谢谢你:)
  • 如果它以逗号分隔返回项目,对您有用吗?如果你有动态数量的“项目”,那么“STUFF”和“coalesce”可以为你工作......让我知道这是否有效,以便我给你解决方案
  • 不幸的是,XML 是从查询中生成的,所以它只会使它们全部成为一个 XML 字段。不过谢谢。

标签: sql-server


【解决方案1】:

为此付出了一些努力,但这应该可行

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.[Id]) 
            FROM [Investigation] c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT [Id], ' + @cols + ' from 
            (
                select id, item, ROW_NUMBER() over (PARTITION BY id order by item asc) as uid
                from [Investigation]
           ) x
            pivot 
            (
                MIN(item)
                for [uid] in (' + @cols + ')
            ) p '


execute(@query)

print @query

【讨论】:

    【解决方案2】:

    我最终使用了子查询。我确实看过您的答案 Pravin,但我不明白,也无法让它发挥作用。这是我三年前在大学里第一次接触 SQL,所以我很生疏。这对我来说至少对单个表查询有用:

    SELECT ( SELECT * FROM ( 
        Select Investigation.ID as ID,
            (SELECT ( SELECT * FROM ( select
                Record.item
                FROM Investigation as Inv
                INNER JOIN Record
                ON Inv.ID = Record.Inv_Id
                WHERE Inv.ID = Investigations.ID
            )
            AS temp FOR xml path(''), type )
        ) AS Items
    from dbo.Investigation
    ) AS xmlextract FOR xml path ('Investigation'), 
    root('root') )AS xmlextract
    

    它产生这样的输出:

    <root>
        <Investigation>
            <ID>1</ID>
            <Items>
                <item>a</item> 
                <item>c</item>
            </Items>
        </Investigation>
        <Investigation>
            <ID>2</ID>
            <Items>
                <item>b</item>
            </Items>
        </Investigation>
    </root>
    

    现在讨论下一个导致我无法使用 xml 数据类型的联合问题:P

    【讨论】:

    • 你能分享一下我的查询得到的结果吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多