----------------------android培训、java培训、期待与您交流! ----------------------
一、实验环境
操作系统:Windows Sever2003
数据库软件:SQL Sever2005
二、实验内容:
本次作业给出的数据集中包含了多家银行业务处理信息,现在我们希望通过建立一个数据仓库对业绩进行分析,了解各业务的运营情况,以期对日常业务处理(诸如发放贷款额度,用户信用卡等级等)提供决策支持。请从如下三方面对数据进行分析:
1.针对各地区、各银行,对订单(order)总额进行分析。
2.针对不同的时间、不同地区、不同银行,分析账户交易(trans)情况, 包括交易前额度、交易额和结余。
3. 针对不同时间、不同地区、不同贷款状态,分析贷款(loan)情况,包括贷款总额,已还款额、未还款额。
三、数据仓库的逻辑模型(结构设计说明)
(一)针对各地区、各银行,对订单(order)总额进行分析。
(二)针对不同的时间、不同地区、不同银行,分析账户交易(trans)情况, 包括交易前额度、交易额和结余。
(三)针对不同时间、不同地区、不同贷款状态,分析贷款(loan)情况,包括贷款总额,已还款额、未还款额。
四、事实表、维度表及其维的概念层次说明
(一)事实表
1. VIEW_CUBE1:以地区维度和银行维度的主键district_id和 bank_id 作为外键。字
段“moneys”和“times”通过聚合函数得到。
2. VIEW_CUBE2:以交易时间维度、交易银行维度和地区维度的主键transTime_id、transBank_id 和district_id做外键。字段“交易前额度”、“交易额”和“结余”通过聚合函数
得到。
3. VIEW_CUBE3:以贷款时间维度、贷款状态维度和地区维度的主键loanTime_id、loanStatus_id 和district_id。字段“贷款总额”、“已还款”和“未还款”通过聚合函数
得到。
(二)维表
1.银行维度:提取order表中的所有的接受银行分类。
2.地区维度:提取district表中的所有region(大地区)和district(小地区)分类。
3.交易时间维度:提取trans表中的交易日期,以years、months、days为三份量,粒度依次变细。表示以年、月、日为单位对数据进行分析。
4.交易银行维度:提取trans表中的所有交易银行分类。
5.贷款时间维度:提取loan表中贷款日期,以years、months、days为三份量,粒度依次变细。表示以years、moths、days为单位对数据进行分析。
6.贷款时间维度:提取loan表中的所有贷款状态分类。
五、数据库还原并建立关系数据库视图如下
六、数据预处理
(一)对account表进行清洗
/*------account表的约束------*/
--以下语句选出业务发生频率不符的列及空值,选出0行,说明此处无噪
select * from account where frequency not in ('POPLATEK MESICNE','POPLATEK TYDNE','POPLATEK PO OBRATU')
--以下语句为account表添加主键约束和业务发生频率类型约束
ALTER TABLE account
ADD CONSTRAINT PK_account_id PRIMARY KEY(account_id),
CONSTRAINT CK_frequency CHECK(frequency IN('POPLATEK MESICNE','POPLATEK TYDNE','POPLATEK PO OBRATU'))
GO
(二)对loan表进行清洗
/*------loan表的约束------*/
--1以下语句选出account表的主键account_id做loan表的外键时不符合主外键约束的列,选出0行,说明此处无噪
select * from loan where loan.account_id not in(select account_id from account)
--2以下语句选出贷款状态不符的列及空值,选出0行,说明无噪
select * from loan where status not in ('A','B','C','D')
--3.已知只有owner类型能申请permanent orders 以及申请贷款loan,在loan表中选出了0行不符合条件的语句,此处无噪。
select * from loan where loan.account_id not in(select account.account_id from account inner join disp on account.account_id=disp.account_id where dispType='owner')
--4以下语句为loan表添加主外键约束和贷款状态取值约束
ALTER TABLE loan
ADD CONSTRAINT PK_loan_id PRIMARY KEY(loan_id), --主键约束
CONSTRAINT FK_account_id FOREIGN KEY(account_id) REFERENCES account(account_id),--外键约束
CONSTRAINT CK_status CHECK(status IN ('A','B','C','D')) --状态值检查约束
GO
(三)对orders表进行清洗
/*------order表的约束------*/
--1.order为关键字,首先将order表名改为orders --2.以下语句选出account表的主键account_id做orders表的外键时不符合主外键约束的列,选出4行,说明orders表中有四行account_id在主表中不存在 select * from orderr where orders.account_id not in(select account_id from account) --删除不符合主外键约束的列,共删除4行(orders表中原有6472行数据,通过主外键约束去噪后还剩6468行) DELETE FROM ordes WHERE orders.account_id not in(select account_id from account) --3.以下语句选出接受银行不符的列及空值,选出0行,说明无噪 select * from orders where bank_to not like ('[A-Z][A-Z]') and bank_to not like ('[a-z][a-z]') --4.以下语句选出借记类型不符的列及空值,选出1379行,说明orders通过主外键去噪后还有1379行不满足借记类型约束 select * from orders where k_symbol not IN ('POJISTNE','SIPO','LEASING','UVER') --删除不符合借记类型检查约束的记录,共删除1379行(orders表中通过次去噪处理后还剩5089行) DELETE FROM orders WHERE k_symbol not IN ('POJISTNE','SIPO','LEASING','UVER') --5.已知只有owner类型能申请permanent orders 以及申请贷款loan,在orders表中选出了4行不符合条件的语句(经过上述预处理后再做次操作并未不符的,其实如果把此处理放在第一步可选出4条)。 select * from orders where orders.account_id not in(select account.account_id from account inner join disp on account.account_id=disp.account_id where dispType='owner') --删除不符合只有owner类型能申请permanent orders DELETE FROM orders where orders.account_id not in(select account.account_id from account inner join disp on account.account_id=disp.account_id where dispType='owner' --以下语句为orders表添加主外键约束和贷款状态取值约束 ALTER TABLE orders ADD CONSTRAINT PK_order_id PRIMARY KEY(order_id), CONSTRAINT FK_orders_account_id FOREIGN KEY(account_id) REFERENCES account(account_id), CONSTRAINT CK_bank_to CHECK(bank_to like ('[A-Z][A-Z]') or bank_to like ('[a-z][a-z]')), CONSTRAINT CK_k_symbol CHECK(k_symbol IN ('POJISTNE','SIPO','LEASING','UVER')) select * into trans from transs
(四)对trans表进行清洗
/*------trans表的约束------*/
--1.trans表中的type字段为关键字,将列名type改为transType
--2.以下语句选出account表的主键account_id做trans表的外键时不符合主外键约束的列,选出4行,说明trans表中有8行account_id在主表中不存在
select * from trans where account_id not in(select account_id from account)
--删除不符合主外键约束的列,共删除8行(trans表中原有77980行数据,通过主外键约束去噪后还剩77972行)
DELETE FROM trans WHERE trans.account_id not in(select account_id from account)
--3.以下语句选出交易银行不符的列及空值,选出1183行,说明有1183行接受银行不符合银行用两个字母表示的检查约束
select * from trans where bank not like ('[A-Z][A-Z]') and bank not like ('[a-z][a-z]')
--删除不符合银行用两个字母表示检查约束的记录,共删除1183行(trans表中通过次去噪处理后还剩76789行)
DELETE FROM trans WHERE bank not like ('[A-Z][A-Z]') and bank not like ('[a-z][a-z]')
--4.以下语句选出业务处理类型不符的列及空值,选出0行,说明此处无噪
select * from trans where transType not IN ('PRIJEM','VYDAJ')
--5.以下语句选出业务操作的模式不符的列及空值,选出0行,说明此处无噪
select * from trans where operation IN ('VYBER KARTOU','VKLAD','PREVOD Z UCTU','VYBER','PREVOD NA UCET')
--6.以下语句选出业务操作属性不符的列及空值,选出17518行,说明trans通过上述两次去噪后还有17518行不满足借记类型约束
select * from trans where k_symbol not IN ('POJISTNE','SLUZBY','PUROK','SANKC. UROK','SIPO','DUCHOD','UVER')
--删除不符合业务操作属性检查约束的记录,共删除17518行(trans表中通过次去噪处理后还剩59271行)
DELETE FROM trans where k_symbol not IN ('POJISTNE','SLUZBY','PUROK','SANKC. UROK','SIPO','DUCHOD','UVER')
--以下语句为trans表添加主外键约束、银行检查约束、业务处理类型检查约束、业务操作模式检查约束及业务操作属性间检查约束
ALTER TABLE trans
ADD CONSTRAINT PK_trans_id PRIMARY KEY(trans_id),
CONSTRAINT FK_trans_account_id FOREIGN KEY(account_id) REFERENCES account(account_id),
CONSTRAINT CK_bank CHECK(bank like ('[A-Z][A-Z]')or bank like('[a-z][a-z]')),
CONSTRAINT CK_transType CHECK(transType IN ('PRIJEM','VYDAJ')),
CONSTRAINT CK_operation CHECK(operation IN ('VYBER KARTOU','VKLAD','PREVOD Z UCTU','VYBER','PREVOD NA UCET')),
CONSTRAINT CK_trans_k_symbol CHECK(k_symbol IN ('POJISTNE','SLUZBY','PUROK','SANKC. UROK','SIPO','DUCHOD','UVER'))
GO
(五)对district表进行清洗
*------district表的约束------*/
--此表只有主键约束,无外键和检查约束,为district表添加主键约束如下
ALTER TABLE district
ADD CONSTRAINT PK_district_id PRIMARY KEY(district_id)
GO
(六)对client表进行清洗
/*------client表的约束------*/
--1为client表添加性别列gender
ALTER TABLE client ADD gender char(2)
GO
--将出生月份在51到62之间的列gender值设为‘女’
UPDATE client SET gender='女'where convert(int,left(RIGHT(birth_number,4),2)) between 51 and 62
--将出生月份在1到12之间的列gender值设为‘男’
UPDATE client SET gender='男'where convert(int,left(RIGHT(birth_number,4),2)) between 1 and 12
--将client表中的birth_number字段中女性客户的出身月份恢复为正常值
UPDATE client set birth_number=left(birth_number,2)+convert(varchar(20),(convert(int,left(RIGHT(birth_number,4),2))-50))+right(birth_number,2)
where convert(int,left(RIGHT(birth_number,4),2)) between 51 and 62
--2.以下语句选出district表的主键ditrict_id做client表的外键时不符合主外键约束的列,选出0行,说明此处无噪
select * from client where district_id not in(select district_id from district)
--3.以下语以下语句为client表添加主外键约束
ALTER TABLE client
ADD CONSTRAINT PK_client_id PRIMARY KEY(client_id),
CONSTRAINT FK_district_id FOREIGN KEY(district_id) REFERENCES district(district_id)
GO
(七)对disp表进行清洗
/*------disp表的约束------*/
--1.将disp表中的字段type关键字改为dispType
--2.以下语句选出account表的主键account_id做disp表的外键时不符合主外键约束的列,选出0行,说明此处无噪
select * from disp where account_id not in(select account_id from account)
--3.以下语句选出account表的主键account_id做trans表的外键时不符合主外键约束的列,选出0行,说明此处无噪
select * from disp where client_id not in(select client_id from client)
--4.以下语句选出业务处理类型不符的列及空值,选出0行,说明此处无噪
select * from disp where dispType not IN ('OWNER','DISPONENT')
--5.已知只有owner类型能申请permanent orders 以及申请贷款loan,在orders表中选出了4行不符合条件的语句,在loan表中选出了0行。
select * from orders where orders.account_id not in(select account.account_id from account inner join disp on account.account_id=disp.account_id where dispType='owner')
select * from loan where loan.account_id not in(select account.account_id from account inner join disp on account.account_id=disp.account_id where dispType='owner')
--删除不符合只有owner类型能申请permanent orders 以及申请贷款loan的记录,共删除4行
DELETE FROM orders where orders.account_id not in(select account.account_id from account inner join disp on account.account_id=disp.account_id where dispType='owner')
--6.以下语句为disp表添加主外键约束、配置类型检查约束
ALTER TABLE disp
ADD CONSTRAINT PK_disp_id PRIMARY KEY(disp_id),
CONSTRAINT FK_disp_account_id FOREIGN KEY(account_id) REFERENCES account(account_id),
CONSTRAINT FK_client_id FOREIGN KEY(client_id) REFERENCES client(client_id),
CONSTRAINT CK_dispType CHECK(dispType IN('OWNER','DISPONENT'))
GO
(八)对card表进行清洗
/*------card表的约束------*/
--1.将card表中的字段type关键字改为cardType
--2.以下语句选出account表的主键account_id做trans表的外键时不符合主外键约束的列,选出0行,说明此处无噪
select * from card where disp_id not in(select disp_id from disp)
--3.以下语句选出业务操作属性不符的列及空值,选出0行,说明此处无噪
select * from card where cardType not IN ('junior','classic','gold')
--4.以下语以下语句为client表添加主外键约束,信用卡类型检查约束
ALTER TABLE card
ADD CONSTRAINT PK_card_id PRIMARY KEY(card_id),
CONSTRAINT FK_disp_id FOREIGN KEY(disp_id) REFERENCES disp(disp_id),
CONSTRAINT CK_cardType CHECK(cardType IN ('junior','classic','gold'))
GO
(九)汇总表1建立
*------------------创建汇总表1----------------*/
--检查汇总表1是否存在,如果为真,删除此表
IF exists(SELECT * from sysobjects where name = 'view_table1')
DROP table view_table1
GO
--创建汇总表1
CREATE TABLE view_table1
(
view1_id int IDENTITY(1,1) NOT NULL,
amount decimal(18,0),
bank_to char(2),
region varchar(50),
district varchar(50)
)
GO
--为汇总表1添加主键约束
ALTER TABLE view_table1
ADD CONSTRAINT PK_view1_id PRIMARY KEY(view1_id)
GO
--想汇总表1插入数据
INSERT INTO view_table1 select amount ,bank_to ,region,district_name from orders inner
join account on account.account_id = orders.account_id inner join disp on
disp.account_id = account.account_id inner join client on disp.client_id
= client.client_id inner join district on district.district_id = client.district_id
(十)汇总表2建立
/*------------------创建汇总表2----------------*/
--创建汇总表2
IF exists(SELECT * from sysobjects where name = 'view_table2')
Drop table view_table2
GO
CREATE TABLE view_table2
(
view2_id int IDENTITY(1,1) NOT NULL,
transType varchar(20),
交易前额度 decimal(18,0),
交易额 decimal(18,0),
结余 decimal(18,0),
bank char(2),
region varchar(50),
district varchar(50),
years int,
months int,
days int
)
GO
--为汇总表2添加主键约束
ALTER TABLE view_table2
ADD CONSTRAINT PK_view2_id PRIMARY KEY(view2_id)
GO
--向汇总表2插入数据
INSERT INTO view_table2 select trans.transType ,(case transType when 'PRIJEM' then
trans.balance-trans.amount else trans.balance+trans.amount end)as 交易前额度,trans.amount AS 交易额,
trans.balance as 结余,trans.bank ,district.region,district_name ,Convert(int,DatePart(yyyy,trans.date))
as years,Convert(int,DatePart(mm,trans.date)) as months,Convert(int,DatePart(dd,trans.date)) as days from
trans inner join account on account.account_id = trans.account_id inner join disp on
disp.account_id = account.account_id inner join client on disp.client_id = client.client_id inner join
district on district.district_id = client.district_id
(十一)汇总表3建立
/*------------------创建汇总表3----------------*/
--创建汇总表3
IF exists(SELECT * from sysobjects where name = 'view_table3')
Drop table view_table3
GO
CREATE TABLE view_table3
(
view3_id int IDENTITY(1,1) NOT NULL,
duration int,
payduration int,
payments decimal(18,0),
贷款总额 decimal(18,0),
已还款 decimal(18,0),
未还款 decimal(18,0),
status char(1),
region varchar(50),
district varchar(50),
years int,
months int,
days int
)
GO
--为汇总表3添加主键约束
ALTER TABLE view_table3
ADD CONSTRAINT PK_view3_id PRIMARY KEY(view3_id)
GO
--向汇总表3插入数据
INSERT INTO view_table3 select loan.duration ,loan.payduration,loan.payments,(loan.payments*loan.duration)
as 贷款总额,(loan.payments*payduration) as 已还款,(loan.payments*(duration-payduration)) as 未还款,
loan.status as status,district.region,district_name ,Convert(int,DatePart(yyyy,loan.date)) as years,
Convert(int,DatePart(mm,loan.date)) as months,Convert(int,DatePart(dd,loan.date)) as days from loan inner
join account on account.account_id = loan.account_id inner join disp on disp.account_id =
account.account_id inner join client on disp.client_id = client.client_id inner join district on
district.district_id = client.district_id
七、维表的建立
(一)地区维表
/*----------------------地区维表----------------------------*/
--检查地区维度是否存在,如果为真,删除此表
IF exists(SELECT * from sysobjects where name = '地区维度')
DROP table 地区维度
GO
--创建地区维度表
CREATE TABLE 地区维度(
district_id int IDENTITY(1,1) NOT NULL,
region varchar(50),
district_name varchar(50)
)
GO
--为地区维度表添加主键约束
ALTER TABLE 地区维度
ADD CONSTRAINT PK_districts_id PRIMARY KEY(district_id)
GO
INSERT INTO 地区维度 SELECT distinct region,district_name FROM distric
(二)接受银行维度
/*----------------------接受银行维表-----------------------*/
--检查接受银行维度是否存在,如果为真,删除此表
IF exists(SELECT * from sysobjects where name = '接受银行维度')
DROP table 接受银行维度
GO
use bank
--创建接受银行维度表
CREATE TABLE 接受银行维度(
bank_to_id int IDENTITY(1,1) NOT NULL,
bank_to char(2)
)
GO
--为接受银行维度添加主键约束
ALTER TABLE 接受银行维度
ADD CONSTRAINT PK_bank_to_id PRIMARY KEY(bank_to_id)
GO
--向银行维度中插入数据
INSERT INTO 接受银行维度 SELECT distinct bank_to FROM orders
(三)交易时间维度
/*---------------------交易时间维表--------------------*/
--检查交易时间维度是否存在,如果为真,删除此表
IF exists(SELECT * from sysobjects where name = '交易时间维度')
Drop table 交易时间维度
GO
--创建交易时间维度
CREATE TABLE 交易时间维度(
transTime_id int IDENTITY(1,1) NOT NULL,
years int,
months int,
days int
)
GO
--为交易时间维度添加主键约束
ALTER TABLE 交易时间维度
ADD CONSTRAINT PK_transTime_id PRIMARY KEY(transTime_id)
GO
--向交易时间维度中插入数据
Insert Into 交易时间维度 select distinct Convert(int,DatePart(yyyy,date)) as years,
Convert(int,DatePart(mm,date)) as months,Convert(int,DatePart(dd,date)) as days
from trans
(四)交易银行维度
/*-----------------交易银行维表---------------------------*/
--检查交易银行维度是否存在,如果为真,删除此表
IF exists(SELECT * from sysobjects where name = '交易银行维度')
DROP table 交易银行维度
GO
--创建交易银行维度表
CREATE TABLE 交易银行维度(
transBank_id int IDENTITY(1,1) NOT NULL,
bank char(2)
)
GO
--为交易银行维度添加主键约束
ALTER TABLE 交易银行维度
ADD CONSTRAINT PK_transsBank_id PRIMARY KEY(transBank_id)
GO
--向交易银行维度中插入数据
Insert into 交易银行维度 SELECT distinct bank from trans
(五)贷款时间维度
/*-----------------贷款时间维表---------------------------*/
--检查贷款时间维度是否存在,如果为真,删除此表
IF exists(SELECT * from sysobjects where name = '贷款时间维度')
Drop table 贷款时间维度
GO
--创建贷款时间维度
CREATE TABLE 贷款时间维度(
loanTime_id int IDENTITY(1,1) NOT NULL,
years int,
months int,
days int
)
GO
--为贷款时间维度添加主键约束
ALTER TABLE 贷款时间维度
ADD CONSTRAINT PK_loanTime_id PRIMARY KEY(loanTime_id)
GO
--向贷款时间维度中插入数据
Insert Into 贷款时间维度 select distinct Convert(int,DatePart(yyyy,date)) as years,
Convert(int,DatePart(mm,date)) as months,Convert(int,DatePart(dd,date)) as days
from loan
(六)贷款状态维度
/*-----------------贷款状态维表---------------------------*/
--检查贷款状态维度是否存在,如果为真,删除此表
IF exists(SELECT * from sysobjects where name = '贷款状态维度')
Drop table 贷款状态维度
GO
--创建贷款状态维度
CREATE TABLE 贷款状态维度
(
loanStatus_id int IDENTITY(1,1) NOT NULL,
status char(1)
)
--为贷款状态维度添加主键约束
ALTER TABLE 贷款状态维度
ADD CONSTRAINT PK_loanStatus_id PRIMARY KEY(loanStatus_id)
GO
--向贷款状态维度中插入数据
Insert into 贷款状态维度 SELECT distinct status from loan
八、事实表建立
(一)事实表1——以地区和接受银行为维度
针对各地区、各银行,对订单(order)总额进行分析。
/*-----------------------------事实表1-----------------------------------*/
create view view_cube1
as
select view_table1.view1_id,接受银行维度.bank_to_id,地区维度.district_id ,sum(view_table1.amount)as
订单金额,count(*) as 订单数量 from view_table1 inner join 接受银行维度 on view_table1.bank_to =
接受银行维度.bank_to inner join 地区维度 on view_table1.region = 地区维度.region and view_table1.district
= 地区维度.district_namegroup by view_table1.bank_to,view_table1.region,view_table1.district,
地区维度.district_id,接受银行维度.bank_to_id,view_table1.view1_id
(二)事实表2——以地区,交易银行和时间为维度
针对不同的时间、不同地区、不同银行,分析账户交易(trans)情况, 包括交易前额度、交易额和结余。
/*-----------------------------事实表2-----------------------------------*/
create view view_cube2
as
select view_table2.view2_id,交易银行维度.transBank_id,地区维度.district_id ,交易时间维度.transTime_id,
sum(view_table2.交易前额度) as 交易前额度,sum(view_table2.交易额) as 交易额,sum(view_table2.结余) as 结余
from view_table2 inner join 交易银行维度 on view_table2.bank = 交易银行维度.bank inner join 地区维度 on
view_table2.region = 地区维度.region and view_table2.district = 地区维度.district_name inner join
交易时间维度 on view_table2.years = 交易时间维度.years and view_table2.months = 交易时间维度.months and
view_table2.days = 交易时间维度.days group byview_table2.years,view_table2.months,view_table2.days,
view_table2.region,view_table2.region,view_table2.bank,交易时间维度.transTime_id,地区维度.district_id,
交易银行维度.transBank_id,view_table2.view2_id
(三)事实表3——以地区,贷款时间和贷款状态为维度
针对不同时间、不同地区、不同贷款状态,分析贷款(loan)情况,包括贷款总额,已还款额、未还款额。
/*-----------------------------事实表3-----------------------------------*/
create view view_cube3
as
select view_table3.view3_id,贷款时间维度.loanTime_id,地区维度.district_id,贷款状态维度.loanStatus_id,
sum(view_table3.贷款总额) as 贷款总额,
sum(view_table3.已还款) as 已还款 ,sum(view_table3.未还款) as 未还款
from view_table3 inner join 贷款状态维度 on view_table3.status = 贷款状态维度.status
inner join 地区维度 on view_table3.region = 地区维度.region and
view_table3.district = 地区维度.district_name
inner join 贷款时间维度 on view_table3.years = 贷款时间维度.years and
view_table3.months = 贷款时间维度.months and view_table3.days = 贷款时间维度.days
group by
view_table3.years,view_table3.months,view_table3.days,view_table3.region,view_table3.district,
view_table3.status,贷款时间维度.loanTime_id,地区维度.district_id,贷款状态维度.loanStatus_id,
view_table3.view3_id
九、多维数据集架构图
(一)事实表1及地区、接受银行维度
(二)事实表2及地区、交易银行、交易时间维度
(三)事实表3及地区、贷款状态、贷款时间维度
十、立方体展现
(一)事实表1展现
(二)事实表2展现
(三)事实表3展现
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima