mysql - 如何将行转置为列

标签 mysql row transpose

我有一张具有巨大值(value)的表格,如下所示。稍后将在表的 SERVICE 列中添加“fbb”类型值。

SITE_NAME  SERVICE  BANDWIDTH
MBCGP1     3g       30
BONWRT     3g       40
BORNR1     3g       30
MBCGP1     2g       8
BONWRT     2g       4
BORNR1     2g       8
BOSBB1     2g       8

我想将这些值插入到这样的表中。

SITE_NAME  2g_bw  3g_bw  fbb_bw
MBCGP1     8       30     0
BONWRT     4       40     0
BORNR1     8       30     0
BOSBB1     8       0      0

我不知道如何编写一条sql。

最佳答案

您可以使用该表的一个实例用于 2g,另一个用于 3g,然后连接这些表。

select 2g.site_name, 2g.bandwidth 2g_bw, 3g.bandwidth 3g_bw, 0 fbb_bw
from yourtable 2g
join yourtable 3g
  on 3g.site_name = 2g.site_name
 and 3g.service = '3g'
where 2g.service = '2g'

然后,您可以使用 INSERT ... SELECT 将结果插入到另一个表中

insert into othertable (site_name, 2g_bw, 3g_bw, fbb_bw)
select 2g.site_name, 2g.bandwidth 2g_bw, 3g.bandwidth 3g_bw, 0 fbb_bw
from yourtable 2g
join yourtable 3g
  on 3g.site_name = 2g.site_name
 and 3g.service = '3g'
where 2g.service = '2g'

更新

正如 @Strawberry 所建议的,您可以使用完整联接从 2g 或 3g(不是两者)中获取 null。

select 2g.site_name, 2g.bandwidth 2g_bw, 3g.bandwidth 3g_bw, 0 fbb_bw
from yourtable 2g
left outer join yourtable 3g
   on 3g.site_name = 2g.site_name
  and 3g.service = '3g'
where 2g.service = '2g'
union
select 3g.site_name, 2g.bandwidth 2g_bw, 3g.bandwidth 3g_bw, 0 fbb_bw
from yourtable 3g
left outer join yourtable 2g
   on 2g.site_name = 3g.site_name
  and 2g.service = '2g'
where 3g.service = '3g'

第一个请求获取与 2G 和 3G 关联的结果,第二个请求获取与 3G 和 2G 关联的结果。如果您合并这些结果,则一定会检索到所有结果。

关于mysql - 如何将行转置为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37268315/

相关文章:

perl - 在 Perl 中转置 CSV 数据

excel - 使用 SAS 处理 Excel 中的大量列

php - (MYSQL) 使用特定参数选择最后一行

mysql - InnoDB 清除 mariadb 进程列表中的 worker

php - 简单的PHP查询题: LIKE

jquery - 动态添加的表行不会触发单击事件

MySQL:将分组数据连接到表 - 仅连接第一行

带复选框的 Android Listview 如何访问复选框

python - 比较 Pandas 中的行

mysql - 将 mysql 行转置为带有数据的自定义列