将多行转换为一行-SQL

将多行转换为一行-SQL,sql,sql-server,tsql,string-aggregation,Sql,Sql Server,Tsql,String Aggregation,我正在尝试将“test”列放在同一行中。我使用的是Stuff(),但是,似乎“test”列正在遍历所有的qID 我错过了什么 SELECT DISTINCT qID, STUFF(( select ',' + B.text from tbl B where B.qID=qID order by B.text

我正在尝试将“test”列放在同一行中。我使用的是
Stuff()
,但是,似乎“test”列正在遍历所有的qID 我错过了什么

SELECT DISTINCT qID,
                STUFF((
                select ',' + B.text
                from tbl B
                where B.qID=qID
                order by B.text
                for xml path('')
                ),1,1,'') as test
FROM tbl 
WHERE qID in (2258060,2296222)
GROUP BY qID

表中缺少别名

  • 条件B.qID=qID总是返回true,就好像1=1,它没有做任何事情一样。它类似于B.qID=B.qID
  • 通过使用别名:

    SELECT DISTINCT qID,
                    STUFF((
                    select ',' + B.text
                    from tbl B
                    where B.qID=A.qID
                    order by B.text
                    for xml path('')
                    ),1,1,'') as test
    FROM tbl A
    WHERE qID in (2258060,2296222)
    GROUP BY qID
    
    
    通过使用表名本身,也可以在外部查询中不使用别名

    SELECT DISTINCT qID,
                    STUFF((
                    select ',' + B.text
                    from tbl B
                    where B.qID=tbl.qID --Table name before qid here 
                    order by B.text
                    for xml path('')
                    ),1,1,'') as test
    FROM tbl
    WHERE qID in (2258060,2296222)
    GROUP BY qID
    

    表上缺少别名

  • 条件B.qID=qID总是返回true,就好像1=1,它没有做任何事情一样。它类似于B.qID=B.qID
  • 通过使用别名:

    SELECT DISTINCT qID,
                    STUFF((
                    select ',' + B.text
                    from tbl B
                    where B.qID=A.qID
                    order by B.text
                    for xml path('')
                    ),1,1,'') as test
    FROM tbl A
    WHERE qID in (2258060,2296222)
    GROUP BY qID
    
    
    通过使用表名本身,也可以在外部查询中不使用别名

    SELECT DISTINCT qID,
                    STUFF((
                    select ',' + B.text
                    from tbl B
                    where B.qID=tbl.qID --Table name before qid here 
                    order by B.text
                    for xml path('')
                    ),1,1,'') as test
    FROM tbl
    WHERE qID in (2258060,2296222)
    GROUP BY qID
    

    请不要要求OP接受答案,除非你有理由相信他们是新的,并且不知道如何接受。@DaleK我使用他和我的查询测试了结果。我不是说你的答案不正确,我是说让OP接受答案不合适。谢谢。成功了。你知道为什么在没有别名的情况下,它似乎可以检索所有内容吗?@Camus在你的查询B.qID=qID中返回的总是true,就好像1=1,它没有做任何事情一样。这类似于B.qID=B.qID。请不要要求OP接受答案,除非你有理由相信他们是新的并且不知道如何接受。@DaleK我使用他和我的查询测试了结果。我不是说你的答案不正确,我是说让OP接受答案是不合适的。谢谢。成功了。你知道为什么在没有别名的情况下,它似乎可以检索所有内容吗?@Camus在你的查询B.qID=qID中返回的总是true,就好像1=1,它没有做任何事情一样。它类似于B.qID=B.qID。