【问题标题】:Rolling up multiple rows into single row using 2 tables使用 2 个表将多行汇总为单行
【发布时间】:2015-06-03 04:08:45
【问题描述】:

有什么方法可以将通常返回多行具有相同值的 SQL 查询更改为以逗号分隔的单行?

Table1
------
Col1
------
Sci-Fi
Action
Crime

Table2
------------
Col1 | Col2
------------
1    | Action
1    | Sci-Fi
2    | Crime
2    | Action
2    | Sci-Fi

我需要一个查询结果如下: (表1和表2合并)

----------------------------
Col1 |  Col2
----------------------------
1    | Action, Sci-Fi
2    | Crime, Action, Sci-Fi

【问题讨论】:

标签: sql sql-server


【解决方案1】:

SELECT MG.movie_id , STUFF(( SELECT ',' + G.genre_name FROM Movie_Genre AS G WHERE G.movie_id = MG.movie_id ORDER BY G.genre_name FOR XML PATH('') ), 1, 1, '') AS Genres FROM Movie_Genre AS MG GROUP BY MG.movie_id

感谢 this post 的疯狂真棒 STUFF 表达。

【讨论】:

  • 我收到此错误:将 varchar 值“Action”转换为数据类型 int 时,Msg 245, Level 16, State 1, Line 1 Conversion failed。
  • 啊,您的 WHERE G.genre_name = MG.movi​​e_id 不起作用,因为您将 int 与 varchar 进行比较。您根本不需要表 1。仅应引用表 2 并将 where 子句更改为 WHERE G.movi​​e_id = NG.movi​​e_id
  • 修复了您的查询:SELECT MG.movi​​e_id , STUFF(( SELECT ',' + G.genre_name FROM Movie_Genre AS G WHERE G.movi​​e_id = MG.movi​​e_id ORDER BY G.genre_name FOR XML PATH(' ') ), 1, 1, '') 从 Movie_Genre 作为 MG GROUP BY MG.movi​​e_id 的流派
  • TY user1499246,你能编辑你对这个查询的回答吗?当你这样做时,我接受。
【解决方案2】:

您可以使用STUFF 函数将多行合并为逗号分隔。

Sample SQl Fiddle

SELECT ID, col2 =
            stuff((
                   SELECT ','+ [col2] FROM t WHERE Id = t1.Id FOR XML PATH('')
                  ),1,1,'') 
FROM (SELECT DISTINCT ID FROM t ) t1

Refer Here for More

【讨论】:

  • 我收到此错误:将 varchar 值“Action”转换为数据类型 int 时,Msg 245, Level 16, State 1, Line 1 Conversion failed。
  • SELECT MG.movi​​e_id, STUFF(( SELECT ',' + G.genre_name FROM Genre AS G WHERE G.genre_name = MG.movi​​e_id ORDER BY G.genre_name FOR XML PATH('') ), 1, 1, '') 从 Movie_Genre 作为 MG GROUP BY MG.movi​​e_id 的流派
  • 您的问题中哪个表是 Genre 或 Movie_Genre?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多