【问题标题】:SQL Grouping of Columns Values [duplicate]列值的 SQL 分组 [重复]
【发布时间】: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 数据库

标签: sql postgresql string-aggregation


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2014-01-15
      相关资源
      最近更新 更多