微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server连接GROUP BY

我有一个看起来像这样的查询
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列对其进行分组并连接Title,因此结果如下

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,'') 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,4),5)

INSERT INTO Tags
VALUES(1,'Tag1'),'Tag2'),(3,(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
    *,' +Title
            FROM
                Tags
                JOIN JobsTagMap
                    ON Tags.TagID=JobsTagMap.TagID
            WHERE
                JobsTagMap.JobID=CTE.JobID
            FOR XML PATH('')
        ),'') AS Title
FROM
    CTE
WHERE
    CTE.RowNbr=1

这会得到这个结果:

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

所以将来总会显示什么表结构和它的数据.这会给你更好的答案

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐