MySQL行转列的实现步骤

MySQL-行转列

示例:

  • 原始数据
select * from history;
hostiditemnameitemvalue
1A10
1B3
2A9
2C40
  • 要达到的效果
select * from history_itemvalue_pivot;
hostidABC
11030
29040

很显然(x-y坐标系来考虑),要将hostid列中的值作为唯一行标识(坐标y值),history.itemname列的值作为列名(坐标x值),hosiditemname相对应的就是history.itemvalue的值(坐标点)。

思路:

  • 选择确定你所需要的列,即y和x
  • 使用额外的列扩展基本表(每一个x值为一个列
  • 分组并汇总扩展表(每一个y值为一组

解决步骤:

  • 步骤1:使用额外的列扩展history表(每一个itemname的值为一列)
create view history_extended as (
  select
    history.*,
    case when itemname = "A" then itemvalue else 0 end as A,
    case when itemname = "B" then itemvalue else 0 end as B,
    case when itemname = "C" then itemvalue else 0 end as C
  from history
);
select * from history_extended;
hostiditemnameitemvalueABC
1A101000
1B3030
2A9900
2C400040

注意,我们并没有更改行数,只是添加了额外的列。(这里将hostiditemname所对应(x-y坐标系)不存在的值(坐标点)设为了0,也可以设置为NULL或“”或特定值,根据业务情况而定)

  • 步骤2:将扩展表分组汇总。即 group by hostid
create view history_itemvalue_pivot as (
  select
    hostid,
    sum(A) as A,
    sum(B) as B,
    sum(C) as C
  from history_extended
  group by hostid
);

select * from history_itemvalue_pivot;
hostidABC
11030
29040

完成!

整合上述步骤如下:

  select
    hostid,
    SUM(case when itemname = "A" then itemvalue else 0 end) as A,
    SUM(case when itemname = "B" then itemvalue else 0 end) as B,
    SUM(case when itemname = "C" then itemvalue else 0 end) as C
  from history
  group by hostid

注意事项:

  • 确定在多余的列中你所要使用的值。
  • 在多余的列中使用什么“中性”值。(NULL0''等等,具体取决于您的实际情况)
  • 分组时使用什么聚合函数(sumcountmax都经常使用)

转载自:https://stackoverflow.com/questions/1241178/mysql-rows-to-columns

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值