列值的 SQL 分组 [重复]
Posted
技术标签:
【中文标题】列值的 SQL 分组 [重复]【英文标题】:SQL Grouping of Columns Values [duplicate] 【发布时间】:2020-06-27 04:40:27 【问题描述】:我想使用一个独特的名称将 cols 分成 1 条记录
id, code, date, name
--------------
1, code1, date1, name1
2, code2, date2, name1
3, code3, date3, name2
我希望结果是
record1: "code1,date1,code2,date2", name1
record2: "code3,date3", name2
我是否使用:
SELECT *
FROM tablename
GROUP BY code, date
HAVING (name the same?)
请帮忙。谢谢。
【问题讨论】:
您使用的是哪个数据库?请用标签指定(即 mysql、PostgreSQL 等) postgresql 数据库 【参考方案1】:您可以尝试在查询中使用 array_agg。这将在 postgres 中对字符串进行分组。
with cte as (
select 1 as ID, 'code1' as code, 'date1' as Date, 'name1' as name union all
select 2 as ID, 'code2' as code, 'date2' as Date, 'name1' as name union all
select 3 as ID, 'code3' as code, 'date3' as Date, 'name2' as name)
select name,array_agg (concat(concat('record',right(name,1), ' :'), concat(code,',', date))) from cte
group by name
这是小提琴: https://dbfiddle.uk/?rdbms=postgres_12&fiddle=905ef890d803b21619da988045e779da
输出:
【讨论】:
【参考方案2】:这是一种方法
create table t(id int, code varchar(30),date1 varchar(10), name varchar(30))
insert into t values(1,'code1', 'date1', 'name1');
insert into t values(2,'code2','date2', 'name1');
insert into t values(3, 'code3', 'date3', 'name2');
select name
,replace(replace(cast(array_agg(col_txt) as varchar(1000)),'',''),'','') as concat_val
from (
select id,code as col_txt,name
from t
union all
select id,date1,name
from t
order by 3,1
)grp
group by name
db 小提琴链接
https://dbfiddle.uk/?rdbms=postgres_12&fiddle=3306c2649615b2ca1ba3720d4a84defb
【讨论】:
以上是关于列值的 SQL 分组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章