黑马程序员____数据清洗实验

----------------------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


你可能感兴趣的:(数据挖掘)