由于我们的仓库表只有一张表,通过字段的条件互斥来区分各类人员,也即度量。所以当我要针对某一主题建立事实表时候,判断各类人员成为了导数据的关键点!
我导的事实表里有三个度量,判断条件各不一样,所以开始为怎么样产生这三个度量值而烦恼,由此产生以下几种方法:
方法一:先按照一个度量导数据,由于维度一样,所以可以使用UPDATE更新事实表:
代码如下:
insert into fjc01j2
select aae043, --数据期别
aab301, --区县代码
aab019, --单位类型编码
aab020, --经济类型编码
aab022, --行业代码
aac013, --原用工形式编码
aac014, --专业技术职务代码
aac015, --职业资格等级
case when ajc00b<0 then -1 when ajc00b is null then 999 else ajc00b end as ajc00b, --失业登记前连续工龄代码
value(ajc093,'90'), --失业原因代码
aca111, --原从事职业代码
count(1) as VAC501, --失业人数
count(1) as VAC502, --登记失业人数
count(1) as VAC503 --领取失业保险金人数
from jf11
group by
aae043, --数据期别
aab301, --区县代码
aab019, --单位类型编码
aab020, --经济类型编码
aab022, --行业代码
aac013, --原用工形式编码
aac014, --专业技术职务代码
aac015, --职业资格等级
ajc00b, --失业登记前连续工龄代码
ajc093, --失业原因代码
aca111; --原从事职业代码
--建立fjc01j2_temp1,用于存放领取失业保险金人数
create table fjc01j2_temp1 as
select
aae043, --数据期别
aab301, --区县代码
aab019, --单位类型编码
aab020, --经济类型编码
aab022, --行业代码
aac013, --原用工形式编码
aac014, --专业技术职务代码
aac015, --职业资格等级
case when ajc00b<0 then -1 end, --失业登记前连续工龄代码
ajc093, --失业原因代码
aca111, --原从事职业代码
count(1) as vac502 --登记失业人数
from jf11
where coalesce(AJC093,'0') <>'0' AND
group by
aae043, --数据期别
aab301, --区县代码
aab019, --单位类型编码
aab020, --经济类型编码
aab022, --行业代码
aac013, --原用工形式编码
aac014, --专业技术职务代码
aac015, --职业资格等级
ajc00b, --失业登记前连续工龄代码
ajc093, --失业原因代码
aca111; --原从事职业代码
update fjc01j2 f1
set vac502=(select vac502
from fjc01j2_temp1 temp
where f1.aae043=temp1.aae043,
f1.aab301=temp1.aab301,
f1.aab019=temp1.aab019,
f1.aab020=temp1.aab020,
f1.aab022=temp1.aab022,
f1.aac013=temp1.aac013,
f1.aac014=temp1.aac014,
f1.aac015=temp1.aac015,
f1.ajc00b=temp1.ajc00b,
f1.ajc093=temp1.ajc093,
f1.aca111=temp1.aca111);
--建立fjc01j2_temp2,用于存放领取失业保险金人数
create table fjc01j2_temp2 as
select
aae043, --数据期别
aab301, --区县代码
aab019, --单位类型编码
aab020, --经济类型编码
aab022, --行业代码
aac013, --原用工形式编码
aac014, --专业技术职务代码
aac015, --职业资格等级
case when ajc00b<0 then -1 end, --失业登记前连续工龄代码
ajc093, --失业原因代码
aca111, --原从事职业代码
count(1) as vac503 --登记失业人数
from jf11
where value(AJC167,0) <> 0
group by
aae043, --数据期别
aab301, --区县代码
aab019, --单位类型编码
aab020, --经济类型编码
aab022, --行业代码
aac013, --原用工形式编码
aac014, --专业技术职务代码
aac015, --职业资格等级
ajc00b, --失业登记前连续工龄代码
ajc093, --失业原因代码
aca111; --原从事职业代码
update fjc01j2 f1
set vac503=(select vac503
from fjc01j2_temp2 temp2
where f1.aae043=temp2.aae043,
f1.aab301=temp2.aab301,
f1.aab019=temp2.aab019,
f1.aab020=temp2.aab020,
f1.aab022=temp2.aab022,
f1.aac013=temp2.aac013,
f1.aac014=temp2.aac014,
f1.aac015=temp2.aac015,
f1.ajc00b=temp2.ajc00b,
f1.ajc093=temp2.ajc093,
f1.aca111=temp2.aca111);
注释: DB2中不允许向上面那样创建临时表,所以改创建视图!
方法二:思路和上面一样,只是不创建临时表,直接使用仓库目录表(代码略)
方法三:直接产生三个度量,使用case when 语句。该方法需要仓库目录表和事实表能在一个用户下都能访问!
insert into fjc01j2
select aae043,
aab301,
aab019,
aab020,
aab022,
aac013,
aac014,
aac015,
case when ajc00b<0 then -1 when ajc00b is null then 999 else ajc00b end as ajc00b,
coalesce(ajc093,'90') as ajc093,
aca111,
count(1) as vac501,
sum(case when coalesce(ajc093,'0')<>'0'
and coalesce(ajc094,'0')<>'0'
and coalesce(ajc00a,'0')='0'
then 1 else 0 end) as vac502,
sum(case when coalesce(ajc167,0)<>0 then 1 else 0 end) as vac503
from jf11
group by aae043,
aab301,
aab019,
aab020,
aab022,
aac013,
aac014,
aac015,
case when ajc00b<0 then -1
when ajc00b is null then 999
else ajc00b end,
coalesce(ajc093,'90'),
aca111