【问题标题】:Concatenate Rows for one column SQL [duplicate]连接一列SQL的行[重复]
【发布时间】:2013-08-02 04:40:36
【问题描述】:

我正在使用以下查询来提取约会数据:

SELECT app.subject, AL.locationName
FROM FilteredAppointment app
INNER JOIN appointmentlocation AL ON app.activityid = AL.appointment
WHERE app.scheduledstart='2013-07-06 15:00:00.000'

输出如下,有 2 行(同一个约会,两个不同的位置):

如何修改此查询以仅显示一行,其中两个位置用逗号连接,如下所示:

Column1: (MZN; OTV)*...
Column2: Room1,Room2

谢谢

【问题讨论】:

  • 它与该问题不重复,因为我需要填充来自不同行和同一列的列值。您建议的帖子,值来自其他列。

标签: sql sql-server-2008-r2


【解决方案1】:

你需要的是SQL Join and concatenate rows,有很多关于它的问题。 在 SQL Server 中没有简单的方法可以做到这一点,但这里有一些技巧:

使用 select for xml

进行连接
select
    app.subject,
    stuff(
       (
           select ', ' + AL.locationName
           from appointmentlocation as AL
           where AL.appointment = app.activityid
           for xml path(''), type
       ).value('.', 'nvarchar(max)')
    , 1, 2, '') 
from FilteredAppointment as app
where app.scheduledstart='2013-07-06 15:00:00.000'

如果您只有一条来自 FilteredAppointment 的记录要连接,您可以使用聚合成变量

declare @locations nvarchar(max), @activityid int

select @activityid = ???

select @locations = isnull(@locations + ', ', '') + AL.locationName
from appointmentlocation as AL
where AL.appointment = @activityid

print @locations

【讨论】:

  • 非常感谢,它成功了。
【解决方案2】:

这个例子会帮助你..或等到我为你查询

  USE app.subject,
    SELECT      AL.locationName AS [Loc],
                STUFF((    SELECT ',' + SUB.Name AS [text()]
                            – Add a comma (,) before each value
                            FROM appointmentlocation AL
                            WHERE
                            app.activityid = AL.appointment

                            FOR XML PATH('') – Select it as XML
                            ), 1, 1, '' )
                            – This is done to remove the first character (,)
                            – from the result
                AS [Sub Categories]
    FROM  FilteredAppointment app

【讨论】:

  • 谢谢,但我猜 Roman Pekar 给出的答案是有效的......
【解决方案3】:
SELECT app.subject, GROUP_CONCAT(AL.locationName, ', ') AS LocationName
FROM FilteredAppointment app
INNER JOIN appointmentlocation AL ON app.activityid = AL.appointment
WHERE app.scheduledstart='2013-07-06 15:00:00.000'
GROUP BY app.subject

未经测试

【讨论】:

  • GROUP_CONCAT 很好,但特定于 MySQL。该帖子被标记为 MS SQL。
  • 我的错,不知道它是特定于 mysql 的!
  • @jpw : OP 想要在 SQL Server 中。
  • 确实如此,但您可以在这里找到解决方法:Simulating group_concat MySQL function in Microsoft SQL Server 2005
  • 'GROUP_CONCAT' 不是 SQL Server 中可识别的内置函数名称
【解决方案4】:

我现在无法测试它,但我认为这可能会起作用

select subject, 
       group_concat(name separator ',') Newcolumn
  from table
 group by subject

【讨论】:

  • 这是为 MySQL 而不是 SQL Server
  • 是的,我不知道,但我在 @Dale 帖子中给出了 msSQL 的解决方法
猜你喜欢
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
相关资源
最近更新 更多