在 SQL 服务器中使用动态 table 连接多行
Concat multiple rows with dynamic table in SQL Server
我有两个 tables,我加入了两个以获得第一个视图,之后我想在一个列中做 GROUP_CONCAT
,但我们没有这个功能SQL服务器。
所以我在这里尝试了一些示例,但我的 SQL 没有成功。找到的示例总是使用 table 生成 GROUP_CONCAT
,但我没有找到任何带有 SQL 结果的示例。
表A:
| CityID | MasterID | Account |
+-----------------------------+
| 01 | 1234 | 1111 |
| 01 | 1234 | 2222 |
| 01 | 1234 | 3333 |
| 02 | 1234 | 4444 |
表B:
| Account | Item | Price |
+------------------------+
| 1111 | A001 | 11,11 |
| 2222 | A001 | 11,11 |
| 3333 | A002 | 22,22 |
| 4444 | A002 | 22,22 |
| 5555 | A002 | 22,22 |
第一个 SQL - 子选择:
SELECT *
FROM TableA, TableB
WHERE TableA.AccountID = TableB.AccountID
输出:
| CityID | MasterID | Account | Account | Item | Price |
+------------------------------------------------------+
| 01 | 1234 | 1111 | 1111 | A0001 | 11,11 |
| 01 | 1234 | 2222 | 2222 | A0001 | 11,11 |
| 01 | 1234 | 3333 | 3333 | A0002 | 22,22 |
| 02 | 1234 | 4444 | 4444 | A0002 | 22,22 |
第二个 SQL - 最终视图:
SELECT
MasterID, GROUP_CONCAT(Item)
FROM
(SELECT *
FROM TableA, TableB
WHERE TableA.AccountID = TableB.AccountID) table01
输出:
| MasterID | Item |
+-----------------+
| 1234 | A0001,A002 |
这会给你预期的结果(我使用 Account 作为列名,而不是你在 table 结构中提到的 AccountId)
;WITH table01
AS
(
SELECT A.CityId,A.MasterId,A.Account Account1,B.Account Account2,B.Item,B.Price
FROM TableA A
INNER JOIN TableB B
ON A.Account = B.Account
)
SELECT A.MasterId,
STUFF(( SELECT ', ' + B.ITEM
FROM table01 B
WHERE B.MasterId = A.MasterId
group by B.MasterId,B.Item
FOR XML PATH('')
), 1, 2, '') Item
FROM table01 A
GROUP BY A.MasterId
我有两个 tables,我加入了两个以获得第一个视图,之后我想在一个列中做 GROUP_CONCAT
,但我们没有这个功能SQL服务器。
所以我在这里尝试了一些示例,但我的 SQL 没有成功。找到的示例总是使用 table 生成 GROUP_CONCAT
,但我没有找到任何带有 SQL 结果的示例。
表A:
| CityID | MasterID | Account |
+-----------------------------+
| 01 | 1234 | 1111 |
| 01 | 1234 | 2222 |
| 01 | 1234 | 3333 |
| 02 | 1234 | 4444 |
表B:
| Account | Item | Price |
+------------------------+
| 1111 | A001 | 11,11 |
| 2222 | A001 | 11,11 |
| 3333 | A002 | 22,22 |
| 4444 | A002 | 22,22 |
| 5555 | A002 | 22,22 |
第一个 SQL - 子选择:
SELECT *
FROM TableA, TableB
WHERE TableA.AccountID = TableB.AccountID
输出:
| CityID | MasterID | Account | Account | Item | Price |
+------------------------------------------------------+
| 01 | 1234 | 1111 | 1111 | A0001 | 11,11 |
| 01 | 1234 | 2222 | 2222 | A0001 | 11,11 |
| 01 | 1234 | 3333 | 3333 | A0002 | 22,22 |
| 02 | 1234 | 4444 | 4444 | A0002 | 22,22 |
第二个 SQL - 最终视图:
SELECT
MasterID, GROUP_CONCAT(Item)
FROM
(SELECT *
FROM TableA, TableB
WHERE TableA.AccountID = TableB.AccountID) table01
输出:
| MasterID | Item |
+-----------------+
| 1234 | A0001,A002 |
这会给你预期的结果(我使用 Account 作为列名,而不是你在 table 结构中提到的 AccountId)
;WITH table01
AS
(
SELECT A.CityId,A.MasterId,A.Account Account1,B.Account Account2,B.Item,B.Price
FROM TableA A
INNER JOIN TableB B
ON A.Account = B.Account
)
SELECT A.MasterId,
STUFF(( SELECT ', ' + B.ITEM
FROM table01 B
WHERE B.MasterId = A.MasterId
group by B.MasterId,B.Item
FOR XML PATH('')
), 1, 2, '') Item
FROM table01 A
GROUP BY A.MasterId