Oracle中行转列、列转行的使用
程序员文章站
2022-07-13 17:14:09
...
问题描述:我有两张表KB22、KC24,包含的关键字段为KB22:AAB299 省份编码 AKE149 医保基金支付 AAZ216 交易流水号 AAE043 清算期别,;KC24:AKC021 人群类别(职工【11,21】、居民【代码表7开头的都是居民】),AKC351 交易流水号,YAB003 参保地行政区代码,YAB600 就医地行政区代码 现在需要做的是统计出同一个省份医保基金支付的总额以及同一个省份职工和居民的医保基金支付总额。
很显然,这两张表的联系为交易流水号:
1、首先比如我统计出201708期别
select *from KB22 A, KC24 B where A.AAZ216 = B.AKC351 and A.AAE043 = '201708';
这是将201708期别的数据统计出来
2、按照省份分组
select substr(B.YAB003,0,2) YAB003, sum(A.AKE149) AKE149 from KB22 A, KC24 B where A.AAZ216 = B.AKC351 and A.AAE043 = '201708' group by substr(B.YAB003,0,2);
这是按照省份进行了分组,这里对AAB299截取前两位是因为统筹区编码一般形如:220100,220200....,这里有个问题,省份里还包含了职工和居民,所以还得对人群类别进行分组
3、按照人群类别分组
select substr(B.YAB003,0,2) YAB003, sum(A.AKE149) AKE149, B.AKC021 from KB22 A, KC24 B where A.AAZ216 = B.AKC351 and A.AAE043 = '201708' group by substr(B.YAB003,0,2),B.AKC021;
由于这里的AKC021都为21,所有没达到预期效果,因为前面说了,AKC021中11,21为职工,7开头的为居民,虽然现在没遇到,但是还得考虑进去,先对11,21,7开头进行处理
4、处理人群类别
select substr(B.YAB003, 0, 2) YAB003,
sum(A.AKE149) AKE149,
(case
when B.AKC021 = '21' then
'11'
when substr(B.AKC021, 0, 1) = '7' then
'70'
else
B.AKC021
end) AKC021
from KB22 A, KC24 B
where A.AAZ216 = B.AKC351
and A.AAE043 = '201708'
group by substr(B.YAB003, 0, 2), B.AKC021;
就是将21归为11组,7开头的归为70组
4、进行行转列select A.AAB299,
A.AKC022 + A.AKC023 AKE149,
A.AKC022,
case
when A.AKC023 is null then
0
else
A.AKC023
end AKC023
from (select substr(A.aab301, 0, 2) AAB299,
sum(A.ake149) AKE149,
(case
when B.akc021 = '21' then
'11'
when substr(B.akc021, 0, 1) = '7' then
'70'
else
B.akc021
end) AKC021
from kb22 A, kc24 B
where A.Aaz216 = B.akc351
and A.aae043 = '201708'
group by substr(A.aab301, 0, 2), B.akc021) pivot(sum(AKE149) for akc021 in('11'
akc022,
'70'
akc023)) A
5、最后页面的效果
上一篇: CSS-自定义变量