使用GROUP BY进行字符串连接

时间:2016-06-06 17:01:42

标签: sql postgresql group-by

使用Postgres,我想转换以下记录:

ID  serviceaccess
11  Value1
11  Value2
11  Value3
22  Value2
22  Value1
22  Value1

进入这个结果:

ID
11 value1, value2, value3
22 value2, value1, value1

我无法使用功能,因为我使用的系统并不支持这些功能。 我可以做个案陈述。

我还检查了以下内容:

SQL Server : GROUP BY clause to get comma-separated values

我试过这个,但它不起作用:

WITH RecurRanked ( dbid, rnk, serviceaccess)
             AS ( 
                SELECT t.t1.dbid, t.t1.rnk, t.t2.serviceaccess || ', ' || t.t1.serviceaccess 
                FROM t.t1
                INNER JOIN t.t2  ON t.t1.dbid = RecurRanked.dbid AND t.t1.rnk = RecurRanked.rnk + 1)
SELECT dbid, MAX(serviceaccess)
FROM RecurRanked
GROUP BY dbid;


    SELECT t.t1.dbid, t.t1.rnk, t.t2.serviceaccess || ', ' || t.t1.serviceaccess 
                FROM t.t1
                INNER JOIN t.t2  ON t.t1.dbid = t.t2.dbid AND t.t1.rnk = t.t2.rnk + 1

2 个答案:

答案 0 :(得分:1)

我不完全明白你的意思“但我不能使用函数,因为我使用的系统不支持那些。我使用的是postgres SQL”。

您可以在PostgreSQL中使用string_agg聚合函数。

select ID, string_agg(serviceaccess, ',') group by ID;

答案 1 :(得分:1)

使用纯SQL很难做到你想做的事情。它可能是有用的(这不是完美的解决方案):

(例如)转换以下记录:

id| serviceaccess
-----------------------
11|" "
11|"Value1"
11|"Value2"
22|" "
22|"Value1"
22|"Value2"
22|"Value3"

在postgresql中测试过。不幸的是,您正在使用的DBMS不支持它:

SELECT t1.id, (max( t1.serviceaccess ||  ',') ||
               max( t2.serviceaccess ||  ',') ||
               max( t3.serviceaccess ||  ',') ||
               max( t4.serviceaccess ||  ',') ||
               max( t5.serviceaccess)) as Services
FROM       test as t1
INNER JOIN test as t2 ON t1.id =t2.id AND (t2.serviceaccess > t1.serviceaccess or 
t1.serviceaccess = ' ')
INNER JOIN test as t3 ON t2.id =t3.id AND (t3.serviceaccess > t2.serviceaccess or 
t2.serviceaccess = ' ')
INNER JOIN test as t4 ON t3.id =t4.id AND (t4.serviceaccess > t3.serviceaccess or 
t3.serviceaccess = ' ')
INNER JOIN test as t5 ON t4.id =t5.id AND (t5.serviceaccess > t4.serviceaccess or 
t4.serviceaccess = ' ')
GROUP BY t1.id

结果:

id| services
------------------------------
22| " , ,Value1,Value2,Value3"
11| " , , ,Value1,Value2"
亲切的问候!