列值的 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 分组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL

按列值的差异对 SQL 中的数据进行分组

如何仅按某个列值的前几个字母对 SQL 查询进行分组?

sql:选择由另一列分组的两列值的计数并获得两个计数的比率

基于最后一列值的numpy排序数组[重复]

将两个具有相似列值的数据框合并在一起[重复]