用SQL展平表

时间:2015-10-06 14:32:37

标签: sql

我想知道是否还有将具有多个值的列分成不同的列。这是我想要做的一个例子: 假设我有如下表1:

 Team | Value_descriptor| Value 
 Team1| Coach           | McGuire 
 Team1| Manager         | Thompson 
 Team1| City            | Detroit
 Team2| Coach           | Johnson
 Team2| Manager         | Stevenson 
 Team2| City            | LA

我想制作如下表格:

 Team | Coach   | Manager | City 
 Team1| McGuire | Thompson| Detroit 
 Team2| Johnson | Stevenson| LA 
 ...

假设我先制作第二张桌子。是否有可以从第一个表中返回第二个表中的值的查询?

2 个答案:

答案 0 :(得分:2)

以下是一种方法,可以使用聚合中使用case表达式的任何数据库。

select t1.Team,
       max(case when t1.Value_Descriptor = 'Coach' then t1.Value end) as Coach,
       max(case when t1.Value_Descriptor = 'Manager' then t1.Value end) as Manager,
       max(case when t1.Value_Descriptor = 'City' then t1.Value end) as City
  from table1 t1
 group by t1.Team

或者,您的数据库可能会提供一些特定的语法来为您进行旋转。

答案 1 :(得分:0)

这里在Oracle DB中测试了 PIVOT 的答案

 select * from tst
 pivot (max(Value)   for (Value_descriptor) in (
 'City' as "CITY",
 'Manager' as "MANAGER",
 'Coach' as "COACH"))
 ;

 TEAM            CITY            MANAGER         COACH         
 --------------- --------------- --------------- ---------------
 Team2           LA              Stevenson       Johnson         
 Team1           Detroit         Thompson        McGuire 

请注意,如果特定 value_descriptor 的值更多,则上述查询会选择MAX值(按字母顺序排列)。

如果要显示连接的所有值,请使用 listagg

替换聚合函数
 pivot (listagg(Value,', ') within  group (order by value)  for (Value_descriptor) in (