我有一个名称重复但标记不同的表,需要输出如下

问题描述

我有一个输入表tabl1

tab1

name    marks    
rb     34      
km     434     
rn     343     
sm     343     
sm     545     
rb     33      
km     22      
jl     234 

要求输出输出

name    marks       
jl      234         
km      434,22      
rb      34,33       
rn      343         
sm      343,545

解决方法

请具体说明您需要的数据库!鉴于您没有分享有关使用哪个数据库的足够信息,我只能举一个不同 SQL 语法的示例。以下是我对不同数据库所做的总结。

MySQL

使用 group_concat 建立新的组

select  name,group_concat(marks)
    from test
    group by name

SQL Server

需要先将 marks 转换为字符串类型,然后再连接,使用 name 作为连接键。

    SELECT DISTINCT 
       name,Stuff((SELECT ',' + cast(marks as varchar)
              FROM   test t2 
              WHERE  t2.name  = t1.name  
              FOR XML PATH('')),1,'') marks
FROM   test t1  

SQL Server 2017 及更高版本

有一个函数string_agg,你可以指定一个分隔符来对行进行分组

select  name,string_agg(marks,',')
    from test
    group by name

Postgres 9.3+

SELECT  name,array_agg(marks) as marks
FROM test
GROUP BY name
,

在 oracle 中,您可以使用 listagg 和 group by 如下:

Select name,Listagg(marks,') within group (order by marks) as marks
  From your_tablr
Group by name
,

在 Postgres 中,您将使用 string_agg()

select name,string_agg(marks::text,') as marks
from the_table
group by name
order by name;