使用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
答案 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"
亲切的问候!