oracle使用decode实现竖表转横表 (列转行)
来源:互联网 发布:162端口 编辑:程序博客网 时间:2024/05/21 04:23
工作中时长会用到竖表转横表(列转行)例如某商场每天都有营业额,数据库中营业额存储的方式是每天很多比每笔对应不同的消费记录
,可能有一天的营业额很多 对应的营业额明细就会很多,如果有个需求是要统计每天营业额多少,按天显示结果该怎么写?
下图的例子是我们数据库中一张记录每月营业情况的表,可以看到201501有很多笔记录,其他月份也有很多。
select amt_fee,inst_datefromR_KC_AGENT_STATISTICS wherei nst_date between 201501 and 201709;
实现方法很简单,此处需要使用oracle的decode函数。如果使用的是mysql则需要使用case when。当让oralce也可以使用case when来实现。
select sum(decode(inst_date, 201501, amt_fee, 0)) amtfees_201501,
sum(decode(inst_date, 201502, amt_fee, 0)) amtfees_201502,
sum(decode(inst_date, 201503, amt_fee, 0)) amtfees_201503,
sum(decode(inst_date, 201504, amt_fee, 0)) amtfees_201504,
sum(decode(inst_date, 201505, amt_fee, 0)) amtfees_201505,
sum(decode(inst_date, 201506, amt_fee, 0)) amtfees_201506,
sum(decode(inst_date, 201507, amt_fee, 0)) amtfees_201507,
sum(decode(inst_date, 201508, amt_fee, 0)) amtfees_201508,
sum(decode(inst_date, 201509, amt_fee, 0)) amtfees_201509,
sum(decode(inst_date, 2015010, amt_fee, 0)) amtfees_201510,
sum(decode(inst_date, 2015011, amt_fee, 0)) amtfees_201511,
sum(decode(inst_date, 2015012, amt_fee, 0)) amtfees_201512
from R_KC_AGENT_STATISTICS
where inst_date between 201501 and 201512;
查询结果如下:
如果有其他条件也可以在decode中再套一层decode。
再举一个复杂点的例子
转之前,同一个chnl_mcht_id,bank_mcht_id,app_key下 可能会有多个不同的acquire_type
select chnl_mcht_id,
BANK_MCHT_ID,
decode(max(wechats),1,'wechat','')||'-'|| decode(max(alipays),1,'alipay','')
||'-'|| decode(max(qqs),1,'qq','')||'-'|| decode(max(jds),1,'jd','')||'-'|| decode(max(baidus),1,'baidus',''),
APP_KEY from (
select chnl_mcht_id,
BANK_MCHT_ID,
decode(ACQUIRER_TYPE, 'wechat', 1, 0) wechats,
decode(ACQUIRER_TYPE, 'alipay', 1,0) alipays,
decode(ACQUIRER_TYPE, 'qq', 1,0) qqs,
decode(ACQUIRER_TYPE, 'jd', 1,0) jds,
decode(ACQUIRER_TYPE, 'baidu', 1,0) baidus,
APP_KEY
from (SELECT DISTINCT chnl_mcht_id, BANK_MCHT_ID, ACQUIRER_TYPE, APP_KEY
FROM wallet_mcht_info_reg
WHERE chnl_mcht_id IS NOT NULL
group by chnl_mcht_id, BANK_MCHT_ID, APP_KEY, ACQUIRER_TYPE)
group by chnl_mcht_id, BANK_MCHT_ID, APP_KEY,ACQUIRER_TYPE)
group by chnl_mcht_id, BANK_MCHT_ID, APP_KEY
转之后同一个chnl_mcht_id,bank_mcht_id,app_key下面 不同的acquire_type 被压缩进一行
阅读全文
1 0
- oracle使用decode实现竖表转横表 (列转行)
- DECODE函数实现列转行
- Oracle中实现列转行的实例
- oracle-listagg()函数实现列转行
- Sql Server使用游标实现列转行
- ORACLE 列转行
- 行转列.列转行 oracle
- Oracle列转行
- oracle 行转列,列转行
- 【ORACLE】行转列,列转行
- oracle 列转行
- oracle 行转列 列转行
- oracle 行转列,列转行
- ORACLE sql 列转行
- oracle列转行
- oracle 行转列 列转行
- oracle 列转行
- oracle 列转行
- UVA
- 如何用Google离线API调用离线地图
- leetcode-8-String to Integer (atoi)
- beautifulsoup
- js新的循环
- oracle使用decode实现竖表转横表 (列转行)
- hdu5728PowMod
- sql 查询商品,出价最低的
- effective C++条款四十七解读
- openstack 管理四十
- 关于Android studio打包发布,以及Android签名的获取
- java 时间戳 转 字符串
- Python 面向对象编程(二)
- scrapy爬虫学习系列四:portia的学习入门