用SQL整平表
我想知道是否有任何方法可以将具有多个值的列拆分为单独的列。下面是我想做的一个例子: 假设我有如下表1:用SQL整平表,sql,Sql,我想知道是否有任何方法可以将具有多个值的列拆分为单独的列。下面是我想做的一个例子: 假设我有如下表1: Team | Value_descriptor| Value Team1| Coach | McGuire Team1| Manager | Thompson Team1| City | Detroit Team2| Coach | Johnson Team2| Manager |
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的数据就没什么意义了。