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

SQL Server串联GROUP BY

杜苏燕
2023-03-14
问题内容

我有一个看起来像这样的查询

SELECT J.JobID,T.Title FROM JobsTagMap J
Left Join Tags T
ON J.TagID=T.TagID

返回以下数据集(简化后,JobID实际上是一个UniqueIdentifier)

JobID    Title
1        Tag1
1        Tag2
2        Tag2
2        Tag5
2        Tag9

现在,我想按JobID列将其分组并连接标题,因此结果如下

JobID    Title
1        Tag1,Tag2
2        Tag2,Tag5,Tag9

我该怎么办?


问题答案:

如果您使用的是SQL Server 2005+。然后您可以这样做:

SELECT 
    JobsTagMap.JobID,
    STUFF
    (
        (
            SELECT 
                ',' +Title
            FROM
                Tags
            WHERE
                Tags.TagID=JobsTagMap.TagID
            FOR XML PATH('')
        )
    ,1,1,'') AS Title
FROM JobsTagMap

编辑

因为您没有向我们显示不同表中的表结构和数据。很难知道。因此,我假设您的表结构如下所示:

CREATE TABLE JobsTagMap
(
    JobID INT,
    TagID INT
)

CREATE TABLE Tags
(
    TagID INT,
    Title VARCHAR(100)
)

有了这个数据:

INSERT INTO JobsTagMap
VALUES(1,1),(1,2),(2,2),(2,4),(2,5)

INSERT INTO Tags
VALUES(1,'Tag1'),(2,'Tag2'),(3,'Tag2'),(4,'Tag5'),(5,'Tag9')

如果获取该数据,则显示的数据JobID不能唯一。您可能在某个Job表的唯一位置有一个表。如果您只想使用显示的这些表,则需要执行以下操作:

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY JobID ORDER BY JobID) AS RowNbr,
        JobsTagMap.*
    FROM
        JobsTagMap
)
SELECT
    *,
    STUFF
    (
        (
            SELECT 
                ',' +Title
            FROM
                Tags
                JOIN JobsTagMap
                    ON Tags.TagID=JobsTagMap.TagID
            WHERE
                JobsTagMap.JobID=CTE.JobID
            FOR XML PATH('')
        )
    ,1,1,'') AS Title
FROM
    CTE
WHERE
    CTE.RowNbr=1

这将为您提供以下结果:

1   1   1   Tag1,Tag2
1   2   2   Tag2,Tag5,Tag9

因此,将来总是显示什么 表结构 及其 数据 。那会给你更好的答案



 类似资料:
  • 问题内容: 我一直在尝试查找有关我的查询的问题。该查询实际上是由HQL的hibernate生成的,但是生成的SQL并没有达到我的期望。稍微修改SQL会产生正确的结果,但是我不确定为什么修改会有所不同。 原始查询(不返回任何行) 修改的查询-用逗号替换交叉联接(隐式交叉联接) 返回一行 我的理解可能是错误的,因为写作与Writing相同。所以我不明白为什么查询返回不同的结果。 与导致此问题的第一个查

  • 我正在使用Keras,我有这个错误。我该如何解决它? 这是我的代码: 我得到了这个问题:

  • 本文向大家介绍sqlServer实现去除字符串空格,包括了sqlServer实现去除字符串空格的使用技巧和注意事项,需要的朋友参考一下  说起去除字符串首尾空格大家肯定第一个想到trim()函数,不过在sqlserver中是没有这个函数的,却而代之的是ltrim()和rtrim()两个函数。看到名字所有人都 知道做什么用的了,ltrim()去除字符串左边的空格,rtrim()去除字符串右边的空格,

  • node-sqlserver 是微软官方发布的 SQL Server 的 Node.js 的驱动程序。可允许 Windows 上运行的 Node.js 程序访问 SQL Server 和 Windows Azure SQL 数据库。 该项目托管在 Github 上。

  • sqlserver manager 是一个多功能sqlserver图形管理界面,支持自定义导入导出,自动扫描服务器,数据库。  

  • 问题内容: 我需要知道是否可以连接字符串,如下所示?如果没有,那么还有什么选择呢? 它应该看起来像人等。 您不能在串联中使用符号,那么替代方法是什么? 问题答案: 仅用于连接。而您错过了增量!

  • 问题内容: 我正在将Visual Studio 2017 for Mac与dotnet Core和EF Core一起使用。在Docker容器中设置mssql映像后,我试图添加连接字符串,但抛出连接错误。我尝试使用不同的选项(例如ip地址,容器名称,主机名等)作为服务器名称,但是它们都不起作用。 带有容器名称 主机名: 通过在终端中使用本地主机进行连接时,其成功连接 但是在运行应用程序时,连接失败。

  • 本文向大家介绍通过+(字符串串联)运算符进行字符串串联。,包括了通过+(字符串串联)运算符进行字符串串联。的使用技巧和注意事项,需要的朋友参考一下 您可以使用Java的“ +”运算符来连接字符串。 示例 输出结果