有时候,我们需要对表中的数据进行行转列,来统计,比如,假如我们有一个奖品表(award),有字段(user_name,award_name,create_datetime),有如下数据。
user_name | award_name | create_date |
---|---|---|
张三 | 手机 | 2022-07-11 |
张三 | 大米 | 2022-07-06 |
李四 | 手机 | 2022-07-11 |
李四 | 大米 | 2022-07-06 |
我们要统计每个用户获得的奖品以及获得时间怎么处理呢?
也就是我们需要查询出如下格式的数据
user_name | shouji | shouji_create_date | dami | dami_create_date |
---|---|---|---|---|
张三 | 手机 | 2022-07-11 | 大米 | 2022-07-06 |
李四 | 手机 | 2022-07-11 | 大米 | 2022-07-06 |
这就相当于进行了行转列,本来表中每个用户都会有几条记录的,行转列后就每个用户只有一条了,那这条sql怎么写呢?
select t.user_name ,
MAX(CASE t.award_name WHEN '手机' THEN t.award_name ELSE '0' END) AS shouji,
MAX(CASE t.award_name WHEN '手机' THEN t.create_date ELSE '0' END) AS shouji_create_date,
MAX(CASE t.award_name WHEN '大米' THEN t.award_name ELSE '0' END) AS dami,
MAX(CASE t.award_name WHEN '大米' THEN t.create_date ELSE '0' END) AS dami_create_date,
from award t where t award_name in('手机','大米')
group by user_name
上面就是Oracle的行转列,主要要注意的是哪些列转为一行要根据award_name来做区分。
MAX(CASE t.award_name WHEN '手机' THEN t.award_name
MAX(CASE t.award_name WHEN '手机' THEN t.create_date