如何使用 STRING_AGG 将一些值组合成一行?
How to use STRING_AGG to group some value into one line?
当所有列都相同但只有一列时,我想将几列合并为一列。这是一个例子:
ID | Name | CP | Job
-----------------------------
1 | Muse | 13 | Job1
1 | Muse | 13 | Job2
1 | Muse | 13 | Job3
2 | Tort | 51 | Job4
2 | Tort | 51 | Job5
我想要:
ID | Name | CP | Job
-----------------------------
1 | Muse | 13 | Job1, Job2, Job3
2 | Tort | 51 | Job4, Job5
我试过这样使用 STRING_AGG :
SELECT ID, Name, CP, STRING_AGG(Job, ',')
FROM myTable
GROUP BY ID, Name, CP, Job
ORDER BY ID
我读过这个:https://database.guide/how-to-return-query-results-as-a-comma-separated-list-in-sql-server/
感谢您的帮助
实际上,我只是自己发现的....我不需要按工作分组:
SELECT ID, Name, CP, STRING_AGG(Job, ',')
FROM myTable
GROUP BY ID, Name, CP
ORDER BY ID
只是一个有趣的观察和一些关于使用 STRING_AGG 的知识。如果您需要以任何特定顺序返回新工作列中的项目,您可以利用 WITHIN GROUP
。
-- Sample data with the inserts rearranged in random order
DECLARE @myTable TABLE
(
ID INT,
[Name] VARCHAR(100),
CP INT,
Job VARCHAR(100)
);
INSERT @myTable
VALUES
(1,'Muse',13,'Job3'),
(1,'Muse',13,'Job1'),
(1,'Muse',13,'Job2'),
(2,'Tort',51,'Job5'),
(2,'Tort',51,'Job4');
-- STRING_AGG ordering NOT guaranteed
SELECT ID, Name, CP, Job = STRING_AGG(Job, ',')
FROM @myTable
GROUP BY ID, Name, CP
ORDER BY ID;
-- STRING_AGG ordering IS guaranteed
SELECT ID, Name, CP, job = STRING_AGG(Job, ',') WITHIN GROUP (ORDER BY Job)
FROM @myTable
GROUP BY ID, Name, CP
ORDER BY ID;
未排序 STRING_AGG 结果:
ID Name CP Job
----------- ----------- ----------- ------------------
1 Muse 13 Job3,Job1,Job2
2 Tort 51 Job5,Job4
未排序 STRING_AGG 结果:
ID Name CP job
----------- ----------- ----------- ------------------
1 Muse 13 Job1,Job2,Job3
2 Tort 51 Job4,Job5
当所有列都相同但只有一列时,我想将几列合并为一列。这是一个例子:
ID | Name | CP | Job
-----------------------------
1 | Muse | 13 | Job1
1 | Muse | 13 | Job2
1 | Muse | 13 | Job3
2 | Tort | 51 | Job4
2 | Tort | 51 | Job5
我想要:
ID | Name | CP | Job
-----------------------------
1 | Muse | 13 | Job1, Job2, Job3
2 | Tort | 51 | Job4, Job5
我试过这样使用 STRING_AGG :
SELECT ID, Name, CP, STRING_AGG(Job, ',')
FROM myTable
GROUP BY ID, Name, CP, Job
ORDER BY ID
我读过这个:https://database.guide/how-to-return-query-results-as-a-comma-separated-list-in-sql-server/
感谢您的帮助
实际上,我只是自己发现的....我不需要按工作分组:
SELECT ID, Name, CP, STRING_AGG(Job, ',')
FROM myTable
GROUP BY ID, Name, CP
ORDER BY ID
只是一个有趣的观察和一些关于使用 STRING_AGG 的知识。如果您需要以任何特定顺序返回新工作列中的项目,您可以利用 WITHIN GROUP
。
-- Sample data with the inserts rearranged in random order
DECLARE @myTable TABLE
(
ID INT,
[Name] VARCHAR(100),
CP INT,
Job VARCHAR(100)
);
INSERT @myTable
VALUES
(1,'Muse',13,'Job3'),
(1,'Muse',13,'Job1'),
(1,'Muse',13,'Job2'),
(2,'Tort',51,'Job5'),
(2,'Tort',51,'Job4');
-- STRING_AGG ordering NOT guaranteed
SELECT ID, Name, CP, Job = STRING_AGG(Job, ',')
FROM @myTable
GROUP BY ID, Name, CP
ORDER BY ID;
-- STRING_AGG ordering IS guaranteed
SELECT ID, Name, CP, job = STRING_AGG(Job, ',') WITHIN GROUP (ORDER BY Job)
FROM @myTable
GROUP BY ID, Name, CP
ORDER BY ID;
未排序 STRING_AGG 结果:
ID Name CP Job
----------- ----------- ----------- ------------------
1 Muse 13 Job3,Job1,Job2
2 Tort 51 Job5,Job4
未排序 STRING_AGG 结果:
ID Name CP job
----------- ----------- ----------- ------------------
1 Muse 13 Job1,Job2,Job3
2 Tort 51 Job4,Job5