繁体   English   中英

SQL 2005将多行合并/连接到一列

[英]SQL 2005 Merge / concatenate multiple rows to one column

我们有一点SQL quandry。 说我有一个看起来像这样的结果......

61E77D90-D53D-4E2E-A09E-9D6F012EB59C | 一个
61E77D90-D53D-4E2E-A09E-9D6F012EB59C |
61E77D90-D53D-4E2E-A09E-9D6F012EB59C | C
61E77D90-D53D-4E2E-A09E-9D6F012EB59C | d
7ce953ca-a55b-4c55-a52c-9d6f012ea903 | Ë
7ce953ca-a55b-4c55-a52c-9d6f012ea903 | F

有没有办法我可以在SQL中将这些结果分组以返回为

61E77D90-D53D-4E2E-A09E-9D6F012EB59C | A B C D
7ce953ca-a55b-4c55-a52c-9d6f012ea903 | EF

人们有什么想法?

非常感谢

戴夫

试试这个:

set nocount on;
declare @t table (id char(36), x char(1))
insert into @t (id, x)
select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'A' union
select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'B' union
select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'C' union
select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'D' union
select '7ce953ca-a55b-4c55-a52c-9d6f012ea903' , 'E' union
select '7ce953ca-a55b-4c55-a52c-9d6f012ea903' , 'F'
set nocount off

SELECT p1.id, 
          stuff(
                   (SELECT
                        ' ' + x
                        FROM @t p2
                        WHERE p2.id=p1.id
                        ORDER BY id, x
                        FOR XML PATH('') 
                   )
                   ,1,1, ''
               ) AS YourValues
      FROM @t p1
      GROUP BY id

OUTPUT:

id                                   YourValues
------------------------------------ --------------
61E77D90-D53D-4E2E-A09E-9D6F012EB59C A B C D
7ce953ca-a55b-4c55-a52c-9d6f012ea903 E F

(2 row(s) affected)

编辑
根据OP关于需要运行现有查询的评论,试试这个:

;WITH YourBugQuery AS
(
    --replace this with your own query
    select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' AS ColID , 'A' AS ColX 
    union select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'B' 
    union select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'C' 
    union select '61E77D90-D53D-4E2E-A09E-9D6F012EB59C' , 'D' 
    union select '7ce953ca-a55b-4c55-a52c-9d6f012ea903' , 'E' 
    union select '7ce953ca-a55b-4c55-a52c-9d6f012ea903' , 'F'

)
SELECT p1.ColID, 
          stuff(
                   (SELECT
                        ' ' + ColX
                        FROM YourBugQuery p2
                        WHERE p2.ColID=p1.ColID
                        ORDER BY ColID, ColX
                        FOR XML PATH('') 
                   )
                   ,1,1, ''
               ) AS YourValues
      FROM YourBugQuery p1
      GROUP BY ColID

这与上面显示的结果设置相同。

我更喜欢定义自定义的用户定义聚合。 是一个UDA 的例子 ,它将完成一些非常接近您要求的东西。

为什么使用用户定义的聚合而不是嵌套的SELECT? 这完全取决于性能,以及您愿意忍受的。 对于少量元素,您肯定可以使用嵌套的SELECT,但对于大的“n”,您会注意到查询计划实际上为输出列表中的每一行运行嵌套的SELECT一次。 如果你在谈论大量的行,这可能是死亡之吻。 使用UDA,可以一次性聚合这些值。

当然,权衡是UDA要求您使用CLR来部署它,这不是很多人经常做的事情。 在Oracle中,这种特殊情况更好一些,因为您可以直接使用PL / SQL来创建用户定义的聚合,但我离题了......

另一种方法是使用FOR XML PATH选项

SELECT
    [ID],
    (
        SELECT
            [Value] + ' '
        FROM
            [YourTable] [YourTable2]
        WHERE
            [YourTable2].[ID] = [YourTable].[ID]
        ORDER BY
            [Value]
        FOR XML PATH('')
    ) [Values]
FROM
    [YourTable]
GROUP BY
    [YourTable].[ID]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM