当前位置: 首页 > 面试题库 >

如何将T-SQL中的结果串联到列中?

柴兴修
2023-03-14
问题内容

我正在研究一个查询,它应该给我这样的结果:

|--Name--|--Surname--|--Language--|--Date--   | 
| James  |  Hetfield | en,gb,fr   | 2011-01-01|
| Lars   |  Ulrich   | gb,fr,ca   | 2011-01-01|

但是我的选择得到了像这样的行集:

| James   |  Hetfield    | en   | 2011-01-01|
| James   |  Hetfield    | gb   | 2011-01-01|
| James   |  Hetfield    | fr   | 2011-01-01|
| Lars    |  Ulrich      | gb   | 2011-01-01|
| Lars    |  Ulrich      | fr   | 2011-01-01|
| Lars    |  Ulrich      | ca   | 2011-01-01|

您建议使用哪种最佳方法将结果集转换为“即时”分组列中的逗号分隔值?我发现CROSS
APPLY可以完成这项工作,但是人们说这种方法非常耗时。另外,DB具有大量数据。

在此先感谢,问候,阿德里安


问题答案:

这是最好的串联方法,它不会像其他XML方法一样扩展特殊字符:

--Concatenation with FOR XML & eliminating control/encoded char expansion "& < >"
set nocount on;
declare @YourTable table (RowID int, HeaderValue int, ChildValue varchar(5))
insert into @YourTable VALUES (1,1,'CCC')
insert into @YourTable VALUES (2,2,'B<&>B')
insert into @YourTable VALUES (3,2,'AAA')
insert into @YourTable VALUES (4,3,'<br>')
insert into @YourTable VALUES (5,3,'A & Z')
set nocount off
SELECT
    t1.HeaderValue
        ,STUFF(
                   (SELECT
                        ', ' + t2.ChildValue
                        FROM @YourTable t2
                        WHERE t1.HeaderValue=t2.HeaderValue
                        ORDER BY t2.ChildValue
                        FOR XML PATH(''), TYPE
                   ).value('.','varchar(max)')
                   ,1,2, ''
              ) AS ChildValues
    FROM @YourTable t1
    GROUP BY t1.HeaderValue

输出:

HeaderValue ChildValues
----------- ---------------
1           CCC
2           AAA, B<&>B
3           <br>, A & Z

(3 row(s) affected)


 类似资料:
  • 有没有更简单的方法将列表中的字符串项串联成单个字符串?我可以使用函数吗? 例如。这是输入,这是所需的输出

  • 问题内容: 假设我们有一个简单的查询,如下所示: 如果结果集中只有一条记录,我想将变量设置为该值。如果我们有两个或多个记录,我希望结果用逗号和空格分隔。编写此T-SQL代码的最佳方法是什么? 例子: 1条记录的结果集: 2条记录的结果集: 3条记录的结果集: 问题答案: 这将为您提供以逗号分隔的列表中的值列表

  • 问题内容: 我正在用SSRS编写一份报告。该数据集填充有MS SQL Server的SQL查询。它使用Union All查询几个相似的表。问题是有一些信息丢失。不同的表适用于不同的工作站点,但是这些表中的任何列都没有站点名称。标识站点的唯一方法是通过表名。在“全部合并”的结果的合并列中,无法分辨出哪些行来自哪个站点。 有没有一种方法可以更改我的查询以在结果中添加一列,该列将具有与每一行相关联的工作

  • 问题内容: 我正在编写一个T-SQL报告,该报告显示不同客户处于不同状态的帐户数量。该报告的结果如下: ‘NULL’状态是有效数据,但我不想显示NULL,而是要显示“ Pending”。到目前为止,这是我的SQL: 任何帮助将不胜感激,我仍在学习T-SQL,因此这可能是一个容易回答的问题。 问题答案: 您可以使用或。前者是标准格式,并返回第一个参数(如果所有参数均为,则返回) 限制为仅2个参数,但

  • 问题内容: 我试过了 但是SQL plus给我“没有适当的结尾”如何在Windows中的oracle sql中指定路径? 问题答案: 使用线轴: 请注意,这将在运行SQL * Plus的目录中创建myoutputfile.txt。 如果您需要在SQLPlus启动时从SQL文件(例如“ tmp.sql”)运行此文件并将其输出到名为“ output.txt”的文件中,请执行以下操作: tmp.sql:

  • 问题内容: 我想捕获到字符串的输出。 PHP文档说: 与将结果直接输出到浏览器的任何东西一样,输出控制功能可用于捕获此功能的输出,并将其保存在字符串中(例如)。 这可能如何工作的一个例子是什么? 这是不可能的,因为它不会给我所需的信息。 问题答案: 使用输出缓冲: