用SQL进行多值列拆分成二值列的一个实现
2017-09-26 11:02
543 查看
在进行数据分析的时候,往往需要把数据表格中的多值列拆分成二值列。如图1中的表A所示,fruits为一个多值列,值可以是不同的水果名字,表明某个以ID作为标识的人吃水果的记录。现在的需求是要把是否吃了什么具体水果拆成多个列,最终如表B所示。在这个例子中,吃水果的记录还有重复,所以需要把重复的记录去掉。
具体来说,可以将这个任务拆分成多个步骤,由不同的SQL select语句完成。如图2所示。这儿使用的数据库是DB2。
图1
图2
select id, INSTR(fruits, 'apple') as apple, INSTR(fruits, 'banana') as banana
from A;
with q1 as (
select id, INSTR(fruits, 'apple') as apple, INSTR(fruits, 'banana') as banana
from A
)
select *
from q1
group by id, apple, banana;
with q1 as (
select id, INSTR(fruits, 'apple') as apple, INSTR(fruits, 'banana') as banana
from A
), q2 as (
select *
from q1
group by id, apple, banana
)
select id, sum(apple) as apple, sum(banana) as banana
from q2
group by id;
具体来说,可以将这个任务拆分成多个步骤,由不同的SQL select语句完成。如图2所示。这儿使用的数据库是DB2。
图1
图2
1. 拆分列
从表A到A1的过程重点是需要将每一行中的水果名字转化成相应新列的0/1值。select id, INSTR(fruits, 'apple') as apple, INSTR(fruits, 'banana') as banana
from A;
2. 去重
可以看到,id为3的记录重复出现了。因此需要用group by去掉重复的。这次的查询是基于上一次的结果,因此我们用with将上一次的查询包含进来。with q1 as (
select id, INSTR(fruits, 'apple') as apple, INSTR(fruits, 'banana') as banana
from A
)
select *
from q1
group by id, apple, banana;
3. 整合行
A2中,id为2的记录出现了2次,可以把相应的列的值整合起来。同样用with将第二次的查询包含进来。with q1 as (
select id, INSTR(fruits, 'apple') as apple, INSTR(fruits, 'banana') as banana
from A
), q2 as (
select *
from q1
group by id, apple, banana
)
select id, sum(apple) as apple, sum(banana) as banana
from q2
group by id;
相关文章推荐
- 循环SQL语句实现,将一个数字字段的商数拆分成多条记录
- 将一个数组按照固定大小进行拆分成数组
- PL/SQL Developer工具登陆一个新创建的用户进行查询时报Dynamic Performance Tables not accessible
- spring多数据源的处理 mybatis实现跨库查询 实现Myibatis动态sql跨数据库的处理 Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样
- 写一个在程序中创建dts包,实现数据用dts导入到sql的类
- gridView 实现 点击一个图片 进行3D翻转 然后变成另外一个图片
- 分治算法实现对一个数进行字典全排序
- SQL进行字符的拼接与拆分
- 借用.net framework的string.Fromat(...),实现一个执行参数化SQL的方法
- 关于ADO.NET,只须一个连接,一条SQL语句,轻松实现增删改查
- DB2中 同一个表中多条数据组合成一条数据 (一条SQL实现)
- 利用PreLoader实现一个平视显示(HUD)效果(可以运用到加载等待效果),并进行简单的讲解
- Python实现对一个元组分别进行按姓名排序与按分数排序
- 定义一个List集合并实例化对应的实现类对象。循环输入任意个整数,输入0结束输入循环,对集合中的数据进行从大到小的排序后输出
- Java数组反射实现动态的判断一个对象书否是数组,并且对数组进行拆包输出 。。
- 实现将一个工资汇总表sheet拆分成多个个人工资单sheet
- 在小工具中维护状态(在一个浏览器里同时登陆两个账号同时进行操作的实现)
- 将一个数组按照固定大小进行拆分成数组
- C# winform实现一个服务端和多个客户端进行通信