【问题标题】:I have a table having duplicate names but different marks, need output as below我有一个名称重复但标记不同的表,需要如下输出
【发布时间】:2021-01-08 07:42:08
【问题描述】:

我有一个输入表 tabl1

标签1

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

【问题讨论】:

  • 请标记您正在使用的 RDBMS 及其版本。例如Oracle11gSQL Server 2019 等,
  • 你使用哪个数据库
  • 这是在一次采访中被问到的,被采访者想要这个问题的SQL查询。
  • @EktaJ 这有点违反 “interview” 的规则,除非他们告诉你寻求帮助是可以的。
  • @T.Peter 不是真的!由于昨天的面试过程结束了。 :)

标签: sql string-concatenation


【解决方案1】:

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

MySQL

使用 group_concat 组成新组

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

SQL 服务器

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

    SELECT DISTINCT 
       name,
       Stuff((SELECT ', ' + cast(marks as varchar)
              FROM   test t2 
              WHERE  t2.name  = t1.name  
              FOR XML PATH('')), 1, 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在 Postgres 中,您将使用 string_agg()

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

      【讨论】:

        猜你喜欢
        • 2021-10-05
        • 1970-01-01
        • 2013-04-22
        • 2014-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        相关资源
        最近更新 更多