如何组合多行,使用SQL在列和行之间合并具有不同值的单元格

时间:2017-08-15 13:59:12

标签: sql database firebird

以下是我现在从SQL查询中获得的数据形式:

ID Name Nationality Institution Degree Result
---------------------------------------------
1  Brian    USA      a           b      c
1  Brian    USA      d           e      f
1  Brian    USA      h           i      j
2  Faye     UK       y           z      x
2  Faye     UK       o           p      q

理想情况下,数据的排序如下:

 ID Name   Nationality      Background
 -------------------------------------------------
 1  Brian     USA           a,b,c; d,e,f; h,i,j
 2  Faye      UK            y,z,x; o,p,q

我是一名SQL初学者,我非常感谢您对此的任何帮助。

以下是我当前的SQL查询:

select 
    table1.id,
    table1.lastname,
    table1.firstname,
    table1.group,
    table2.institution,
    table2.degree,
    table2.result,
from 
    table1
inner join 
    table2 on (table1.id = table2.id)
where 
    ((table1.startyear = '2017')
     and (table1.group = 'A'))

2 个答案:

答案 0 :(得分:0)

您可以查询如下:

Select Id, [Name], Nationality, 
    Background = Stuff((Select '; '+Institution+','+Degree+','+Result from #table1 where id = t.Id for xml path('')),1,2,'')
 from #table1 t
 Group by Id, [Name], Nationality

答案 1 :(得分:0)

因此,使用list()和Firebird(IBExpert)中的||字符串concat给我们:

UNTESTED:List() Doc需要2.1版或更高版本。 先前的SO answer using List()

注意Group位于reserved words list;所以你可能不得不使用firebird

中的"来逃避它
SELECT table1.id
     , table1.lastname
     , table1.firstname
     , table1."group"
     , List(table2.institution ||','||
            table2.degree      ||','||
            table2.result,';') as Background
FROM table1
INNER JOIN  table2 
   ON table1.id = table2.id
WHERE table1.startyear = '2017'
  AND table1."group" = 'A'
GROUP BY table1.id
       , table1.lastname
       , table1.firstname
       , table1."group"