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

希望这对某人有所帮助...