用SQL整平表

用SQL整平表,sql,Sql,我想知道是否有任何方法可以将具有多个值的列拆分为单独的列。下面是我想做的一个例子: 假设我有如下表1: Team | Value_descriptor| Value Team1| Coach | McGuire Team1| Manager | Thompson Team1| City | Detroit Team2| Coach | Johnson Team2| Manager |

我想知道是否有任何方法可以将具有多个值的列拆分为单独的列。下面是我想做的一个例子: 假设我有如下表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 
 ...
我想制作一张表格如下:

 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 
 ...

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

这里有一种方法,可以使用聚合中的
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

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

这里的答案是在Oracle DB中测试的

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

请注意,如果特定值有更多值,上述查询将选择最大值(按字母顺序)

如果要显示所有连接的值,请将聚合函数替换为listagg


您使用的是哪种数据库管理系统?有些产品的功能在这里可能很有用。如果一个团队的数据库中没有多个coach,这将起作用。@Troll先生:我认为这是一个安全的假设。否则,OP的数据就没什么意义了。