如何将多行数据分组到同一行?

时间:2019-12-26 18:49:19

标签: mysql sql

我有一个查询:

select * from dwtrat_edu_tempdb.test1 

返回

tile_to_update elementary_school   high_school   university
2270210        583                 null          null
2270210        321                 10529         null
2270210        null                null          58151

我想合并行并从每一列中取一个值(无论哪个,第一个,最后一个可以是任何值),所以一所小学,一所高中,一所大学。

它看起来像:

tile_to_update elementary_school   high_school   university
2270210        583                 10529         58151

但是,当我尝试分组时:

select * from dwtrat_edu_tempdb.test1 
group by tile_to_update

我仅获得其中一列的值,而不是所有列的组合

tile_to_update elementary_school   high_school   university
2270210        null                10529         null

预先感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

如果您不关心任何特定值,则可以选择ANY_VALUE / MIN / MAX:

select tile_to_update,
       ANY_VALUE(elementary_school),ANY_VALUE(high_school),ANY_VALUE(university) 
from dwtrat_edu_tempdb.test1 
group by tile_to_update

答案 1 :(得分:1)

也请尝试以下查询,让我知道它是否对您有用。

SELECT DISTINCT tile_to_update
  ,COALESCE(elementary_school)
  ,COALESCE(high_school)
  ,COALESCE(university)
FROM dwtrat_edu_tempdb.test1 

答案 2 :(得分:0)

Lukasz Szozda回答了您的问题;但是,由于每列有不止1个非null值,所以我几乎可以保证您将自己设置为失败,因为这会导致不必要的数据丢失。您可能希望使用GROUP_CONCAT,而不是使用ANY_VALUE(),MIN(),MAX()或COALESCE()返回单个值,以便生成这样的值列表:

SELECT tile_to_update, 
  GROUP_CONCAT(elementary_school),
  GROUP_CONCAT(high_school),
  GROUP_CONCAT(university)
FROM dwtrat_edu_tempdb.test1
GROUP BY tile_to_update

结果:

"tile_to_update"=>"2270210", "elementary_school" =>"583, 321", "high_school" =>"10529",  "university" =>"10529