sql - select 部分唯一值并将非唯一值连接成字符串
sql - select partially unique values and concatenate non unique values into string
假设我有以下数据集:
A B C
--- ---- ---
1 aaa 1
1 aaa 2
1 aaa 5
1 aaa 8
2 bbb 2
2 bbb 4
3 ccc 1
4 ddd 2
5 aaa 2
6 bbb 0
6 bbb 9
我如何按 A 列和 B 列以及 return 第三列进行分组,该第三列是使用 SQL 连接在一起(以逗号分隔的字符串)的该组的所有 C 的唯一值。
为清楚起见,这是我正在寻找的结果数据集:
A B C_Concat
--- ---- ---
1 aaa 1,2,5,8
2 bbb 2,4
3 ccc 1
4 ddd 2
5 aaa 2
6 bbb 0,9
我目前正在 MS Access 中查询这个,但理想情况下,如果所有 SQL 数据库都有一个通用的解决方案,那就太好了。
注意:在此用例中,C 列只有 10 个已知值,即 0-9
所以使用 ConcatRelated 函数并没有真正解决我的问题,因为它看起来效率很低,并导致本来就很慢的 MS 访问(具有大数据集)陷入停顿。
我能够在 SQL 中为我的用例使用一些子查询来做到这一点 - 因为 C 列上方的 added/noted 包含一个定义良好的数据集。
对于我的用例,MS Access 中的以下 SQL(和串联)有效:
SELECT A, B, left(C_tmp, len(C_tmp) - 1) AS C_Concat
FROM (SELECT qry.A, qry.B,
(SELECT "0," FROM Table WHERE PointNumber=qry.A and C=0) &
(SELECT "1," FROM Table WHERE PointNumber=qry.A and C=1) &
(SELECT "2," FROM Table WHERE PointNumber=qry.A and C=2) &
(SELECT "3," FROM Table WHERE PointNumber=qry.A and C=3) &
(SELECT "4," FROM Table WHERE PointNumber=qry.A and C=4) &
(SELECT "5," FROM Table WHERE PointNumber=qry.A and C=5) &
(SELECT "6," FROM Table WHERE PointNumber=qry.A and C=6) &
(SELECT "7," FROM Table WHERE PointNumber=qry.A and C=7) &
(SELECT "8," FROM Table WHERE PointNumber=qry.A and C=8) &
(SELECT "9," FROM Table WHERE PointNumber=qry.A and C=9)
AS C_tmp
FROM (SELECT A, B FROM Table GROUP BY A, B) AS qry) AS qry2;
我查看的其他替代方案是将所有 data/tables 导出到另一个支持字符串聚合的数据库中。这将提供更通用的解决方案,其中 C 列的内容是未知的。我相信这里的解决方案是(如果有帮助,请随时扩展此列表):
Mariadb:使用group_concat
Oracle 11g R2 及更高版本:使用listagg
Oracle 11g R2 以下:使用wm_concat
希望这对某人有所帮助...
假设我有以下数据集:
A B C
--- ---- ---
1 aaa 1
1 aaa 2
1 aaa 5
1 aaa 8
2 bbb 2
2 bbb 4
3 ccc 1
4 ddd 2
5 aaa 2
6 bbb 0
6 bbb 9
我如何按 A 列和 B 列以及 return 第三列进行分组,该第三列是使用 SQL 连接在一起(以逗号分隔的字符串)的该组的所有 C 的唯一值。
为清楚起见,这是我正在寻找的结果数据集:
A B C_Concat
--- ---- ---
1 aaa 1,2,5,8
2 bbb 2,4
3 ccc 1
4 ddd 2
5 aaa 2
6 bbb 0,9
我目前正在 MS Access 中查询这个,但理想情况下,如果所有 SQL 数据库都有一个通用的解决方案,那就太好了。
注意:在此用例中,C 列只有 10 个已知值,即 0-9
所以使用 ConcatRelated 函数并没有真正解决我的问题,因为它看起来效率很低,并导致本来就很慢的 MS 访问(具有大数据集)陷入停顿。
我能够在 SQL 中为我的用例使用一些子查询来做到这一点 - 因为 C 列上方的 added/noted 包含一个定义良好的数据集。
对于我的用例,MS Access 中的以下 SQL(和串联)有效:
SELECT A, B, left(C_tmp, len(C_tmp) - 1) AS C_Concat
FROM (SELECT qry.A, qry.B,
(SELECT "0," FROM Table WHERE PointNumber=qry.A and C=0) &
(SELECT "1," FROM Table WHERE PointNumber=qry.A and C=1) &
(SELECT "2," FROM Table WHERE PointNumber=qry.A and C=2) &
(SELECT "3," FROM Table WHERE PointNumber=qry.A and C=3) &
(SELECT "4," FROM Table WHERE PointNumber=qry.A and C=4) &
(SELECT "5," FROM Table WHERE PointNumber=qry.A and C=5) &
(SELECT "6," FROM Table WHERE PointNumber=qry.A and C=6) &
(SELECT "7," FROM Table WHERE PointNumber=qry.A and C=7) &
(SELECT "8," FROM Table WHERE PointNumber=qry.A and C=8) &
(SELECT "9," FROM Table WHERE PointNumber=qry.A and C=9)
AS C_tmp
FROM (SELECT A, B FROM Table GROUP BY A, B) AS qry) AS qry2;
我查看的其他替代方案是将所有 data/tables 导出到另一个支持字符串聚合的数据库中。这将提供更通用的解决方案,其中 C 列的内容是未知的。我相信这里的解决方案是(如果有帮助,请随时扩展此列表):
Mariadb:使用group_concat
Oracle 11g R2 及更高版本:使用listagg
Oracle 11g R2 以下:使用wm_concat
希望这对某人有所帮助...