Mysql 彩票分析實例
create database CP1; #創建數據庫
use cp1;
# drop table TableRaw;
# 創建表
create table if not exists TableRaw(
rawdata varchar(200) not null unique);
# 導入數據
load data infile 'C:\\RawData.TXT'
into table TableRaw
fields terminated by '\t';
select * from TableRaw;
desc tableraw;
select count(*) from TableRaw;
---------------原始數據爲1個字段,對其進行拆分,先建立字段------------------
alter table TableRaw add RowNumber int primary key auto_increment; -- 自增字段,用來記錄彩票張數
alter table TableRaw add FNo char(7) not null default ''; -- 本號、票號唯一代表一張彩票
alter table TableRaw add TNo char(3) not null default ''; -- 票號
alter table TableRaw add Mark char(10) not null default ''; -- 圖符
alter table TableRaw add Reward char(10) not null default ''; -- 獎金
alter table TableRaw add FloatNo char(10) not null default ''; -- 漂移字符
alter table TableRaw add CNo char(8) not null default ''; -- 手工驗獎
alter table TableRaw add LCode char(29) not null default ''; -- 物流碼
alter table TableRaw add SCode char(41) not null default ''; -- 保安碼
#重新排序
alter table tableraw modify RowNumber int first;
desc tableRaw;
-- 圖符1-10,將圖符字段拆分爲10個單字母字段
#創建存儲過程
delimiter $$
create procedure markfix()
Begin
declare n int;
declare num varchar(2);
set n=1;
set @sqltext = '';
while n<10 do
set num=cast(n as char);
set @sqltext = concat(@sqltext, 'add mark',num,' char(1) not null, ');
-- 1.@sqltext = add mark1 char(1) not null,
-- 2.@sqltext = add mark1 char(1) not null, add mark2 char(1) not null,
-- 3.@sqltext = add mark1 char(1) not null, add mark2 char(1) not null, add mark3 char(1) not null,
-- 9.@sqltext = add mark1 char(1) not null, add mark2 char(1) not null,....add mark9 char(1) not null,
set n=n+1;
end while;
set @sqltext = concat('alter table tableraw ',@sqltext, 'add mark10 char(1) not null;');
-- final. @sqltext = alter table tableraw add mark1 char(1) not null, add mark2 char(1) not null,....add mark9 char(1) not null, add mark10 char(1) not null;
end $$
delimiter ;
-- alter table tableraw add mark1 char(1) not null,
-- add mark2 char(1) not null,
-- add mark3 char(1) not null,
-- add mark4 char(1) not null,
-- add mark5 char(1) not null,
-- add mark5 char(1) not null,
-- add mark6 char(1) not null;
#drop procedure markfix;
#檢查生成的sql語句
call markfix();
select @sqltext;
#執行語句
prepare stmt from @sqltext;
execute stmt;
#檢查表結構
desc TableRaw;
-- 獎碼1-10,將資金字段拆分爲10個單字母字段
#創建存儲過程
delimiter $$
create procedure rewardfix()
Begin
declare n int;
declare num varchar(2);
set n=1;
set @sqltext = '';
while n<10 do
set num=cast(n as char);
set @sqltext = concat(@sqltext, 'add reward',num,' char(1) not null, ');
set n=n+1;
end while;
set @sqltext = concat('alter table tableraw ',@sqltext, 'add reward10 char(1) not null;');
end $$
delimiter ;
#drop procedure markfix;
#檢查生成的sql語句
call rewardfix();
select @sqltext;
#執行語句
prepare stmt1 from @sqltext;
execute stmt1;
#檢查表結構
desc TableRaw;
--------原始數據爲1個字段,對其進行拆分,對字段進行賦值-------------
UPDATE TableRaw SET FNo = substring(rawdata,1,7);
UPDATE TableRaw SET TNo = substring(rawdata,9,3);
UPDATE TableRaw SET Mark = substring(rawdata,12,10); -- =MID($A3,12,10)
UPDATE TableRaw SET Reward = substring(rawdata,22,10); -- =MID($A3,22,10)
UPDATE TableRaw SET FloatNo = substring(rawdata,32,10); -- =MID($A3,32,10)
UPDATE TableRaw SET CNo = substring(rawdata,42,8); -- =MID($A3,42,8)
UPDATE TableRaw SET LCode = substring(rawdata,50,29); -- =MID($A3,50,29)
UPDATE TableRaw SET SCode = substring(rawdata,79,41); -- =MID($A3,79,41)
select * from tableraw;
-- 圖符1-10
#創建存儲過程
delimiter $$
create procedure markset()
Begin
declare n int;
declare num varchar(2);
set n=1;
set @sqltext = '';
while n<10 do
set num=cast(n as char);
set @sqltext = concat(@sqltext, ' mark',num,' = substring(mark, ',num, ', 1), ');
set n=n+1;
end while;
set @sqltext = concat('update tableraw set',@sqltext, ' mark10 = substring(mark, 10, 1);');
end $$
delimiter ;
-- update tableraw set mark1 = substring(mark,1,1),
-- mark2 = substring(mark,2,1),
-- ...
-- mark10=substring(mark,10,1);
#drop procedure markset;
-- concat(@sqltext, ' mark',num,' = substring(mark, ',num, ', 1), ');
-- mark1 = substring(mark, 1, 1),
#檢查生成的sql語句
call markset();
select @sqltext;
prepare stmt2 from @sqltext;
execute stmt2;
#檢查表數據及表結構
select * from tableraw;
desc tableraw;
-- 獎碼1-10
#創建存儲過程
delimiter $$
create procedure rewardset()
Begin
declare n int;
declare num varchar(2);
set n=1;
set @sqltext = '';
while n<10 do
set num=cast(n as char);
set @sqltext = concat(@sqltext, ' reward',num,' = substring(reward, ',num, ', 1), ');
set n=n+1;
end while;
set @sqltext = concat('update tableraw set',@sqltext, ' reward10 = substring(reward, 10, 1);');
end $$
delimiter ;
#drop procedure rewardset;
#檢查生成的sql語句
call rewardset();
select @sqltext;
prepare stmt3 from @sqltext;
execute stmt3;
#檢查表數據及表結構
select * from tableraw;
desc tableraw;
----------------------獎金倍數-------------------------------
-- Create MarkMapping
CREATE TABLE MarkMapping (
Mark char(1) not null,
MarkNo int not null
);
insert into MarkMapping values ('m', 1); -- m可獲得獎金
insert into MarkMapping values ('n', 2); -- n可獲得2倍獎金
insert into MarkMapping values ('o', 2); -- o可獲得2倍獎金
insert into MarkMapping values ('p', 2); -- p可獲得2倍獎金
select * from MarkMapping;
-- 圖倍數1-10
#創建存儲過程
delimiter $$
create procedure marktimes()
Begin
declare n int;
declare num varchar(2);
set n=1;
set @sqltext = '';
while n<10 do
set num=cast(n as char);
set @sqltext = concat(@sqltext, 'add marktimes',num,' int not null default 0, ');
set n=n+1;
end while;
set @sqltext = concat('alter table tableraw ',@sqltext, 'add marktimes10 int not null default 0;');
end $$
delimiter ;
-- alter table TableRaw add [圖倍數' + @No + '] [int] not null default 0
#drop procedure marktimes;
#檢查生成的sql語句
call marktimes();
select @sqltext;
#執行語句
prepare stmt4 from @sqltext;
execute stmt4;
#檢查表結構
desc TableRaw;
select * from TableRaw;
select * from markmapping;
-- 爲圖倍數賦值
update tableraw inner join markmapping on tableraw.mark1 = markmapping.Mark set tableraw.marktimes1 = markmapping.markNo;
update tableraw inner join markmapping on tableraw.mark2 = markmapping.Mark set tableraw.marktimes2 = markmapping.markNo;
update tableraw inner join markmapping on tableraw.mark3 = markmapping.Mark set tableraw.marktimes3 = markmapping.markNo;
update tableraw inner join markmapping on tableraw.mark4 = markmapping.Mark set tableraw.marktimes4 = markmapping.markNo;
update tableraw inner join markmapping on tableraw.mark5 = markmapping.Mark set tableraw.marktimes5 = markmapping.markNo;
update tableraw inner join markmapping on tableraw.mark6 = markmapping.Mark set tableraw.marktimes6 = markmapping.markNo;
update tableraw inner join markmapping on tableraw.mark7 = markmapping.Mark set tableraw.marktimes7 = markmapping.markNo;
update tableraw inner join markmapping on tableraw.mark8 = markmapping.Mark set tableraw.marktimes8 = markmapping.markNo;
update tableraw inner join markmapping on tableraw.mark9 = markmapping.Mark set tableraw.marktimes9 = markmapping.markNo;
update tableraw inner join markmapping on tableraw.mark10 = markmapping.Mark set tableraw.marktimes10 = markmapping.markNo;
#檢查表數據及表結構
select * from tableraw;
------------------------獎金金額---------------------------
-- Create MarkMapping
CREATE TABLE RewardMapping (
Mark char(1) not null,
MarkNo int not null);
insert into RewardMapping values ('A', 5);
insert into RewardMapping values ('B', 10);
insert into RewardMapping values ('C', 20);
insert into RewardMapping values ('D', 25);
insert into RewardMapping values ('E', 50);
insert into RewardMapping values ('F', 100);
insert into RewardMapping values ('G', 200);
insert into RewardMapping values ('H', 500);
insert into RewardMapping values ('I', 1000);
insert into RewardMapping values ('J', 100000);
-- 查看數據及表結構
select * from RewardMapping;
desc rewardmapping;
-- 獎金1-10
#創建存儲過程
delimiter $$
create procedure rewardvalue()
Begin
declare n int;
declare num varchar(2);
set n=1;
set @sqltext = '';
while n<10 do
set num=cast(n as char);
set @sqltext = concat(@sqltext, 'add rewardvalue',num,' int not null default 0, ');
set n=n+1;
end while;
set @sqltext = concat('alter table tableraw ',@sqltext, 'add rewardvalue10 int not null default 0;');
end $$
delimiter ;
#drop procedure rewardvalue;
#檢查生成的sql語句
call rewardvalue();
select @sqltext;
#執行語句
prepare stmt5 from @sqltext;
execute stmt5;
#檢查表結構
desc TableRaw;
select * from RewardMapping;
select * from tableraw;
-- 爲獎金列賦值
update tableraw inner join RewardMapping on tableraw.reward1 = RewardMapping.Mark set tableraw.rewardvalue1 = RewardMapping.markNo;
update tableraw inner join RewardMapping on tableraw.reward2 = RewardMapping.Mark set tableraw.rewardvalue2 = RewardMapping.markNo;
update tableraw inner join RewardMapping on tableraw.reward3 = RewardMapping.Mark set tableraw.rewardvalue3 = RewardMapping.markNo;
update tableraw inner join RewardMapping on tableraw.reward4 = RewardMapping.Mark set tableraw.rewardvalue4 = RewardMapping.markNo;
update tableraw inner join RewardMapping on tableraw.reward5 = RewardMapping.Mark set tableraw.rewardvalue5 = RewardMapping.markNo;
update tableraw inner join RewardMapping on tableraw.reward6 = RewardMapping.Mark set tableraw.rewardvalue6 = RewardMapping.markNo;
update tableraw inner join RewardMapping on tableraw.reward7 = RewardMapping.Mark set tableraw.rewardvalue7 = RewardMapping.markNo;
update tableraw inner join RewardMapping on tableraw.reward8 = RewardMapping.Mark set tableraw.rewardvalue8 = RewardMapping.markNo;
update tableraw inner join RewardMapping on tableraw.reward9 = RewardMapping.Mark set tableraw.rewardvalue9 = RewardMapping.markNo;
update tableraw inner join RewardMapping on tableraw.reward10 = RewardMapping.Mark set tableraw.rewardvalue10 = RewardMapping.markNo;
#檢查表數據及表結構
select * from tableraw where rewardvalues<>0;
-----------------------中獎金額--------------------------
-- 中獎1-10
#創建存儲過程
delimiter $$
create procedure bingo()
Begin
declare n int;
declare num varchar(2);
set n=1;
set @sqltext = '';
while n<10 do
set num=cast(n as char);
set @sqltext = concat(@sqltext, 'add bingo',num,' int not null default 0, ');
set n=n+1;
end while;
set @sqltext = concat('alter table tableraw ',@sqltext, 'add bingo10 int not null default 0;');
end $$
delimiter ;
#drop procedure bingo;
#檢查生成的sql語句
call bingo();
select @sqltext;
#執行語句
prepare stmt6 from @sqltext;
execute stmt6;
#檢查數據及表結構
select * from tableraw;
desc TableRaw;
-- 求中獎金額
#創建存儲過程
/* update TableRaw set 中獎金額'+@No+' = TableRaw.圖倍數'+@No+' * TableRaw.獎面額'+@No */
update tableraw set bingo1 = marktimes1 * rewardvalue1,
bingo2 = marktimes2 * rewardvalue2;
select * from tableraw;
delimiter $$
create procedure bingoinput()
Begin
declare n int;
declare num varchar(2);
set n=1;
set @sqltext = '';
while n<10 do
set num=cast(n as char);
set @sqltext = concat(@sqltext, 'bingo',num,'=marktimes',num,'*rewardvalue',num,', ');
set n=n+1;
end while;
set @sqltext = concat('update tableraw set ',@sqltext, 'bingo10=marktimes10*rewardvalue10;');
end $$
delimiter ;
#drop procedure bingoinput;
#檢查生成的sql語句
call bingoinput();
select @sqltext;
#執行語句
prepare stmt7 from @sqltext;
execute stmt7;
#檢查數據及表結構
select * from tableraw;
desc TableRaw;
-- 總中獎金額
alter table TableRaw add bingovalue int not null default 0;
update TableRaw set bingovalue = bingo1 + bingo2 + bingo3 + bingo4 + bingo5 + bingo6 + bingo7 + bingo8 + bingo9 + bingo10;
#檢查數據及表結構
select * from tableraw where bingovalue<>0;
desc TableRaw;
-- 導出最終數據
select FNo, TNo, Mark,Reward,bingovalue from tableraw into outfile 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/final.csv'
fields terminated by '\,'
#optionally enclosed by '\"'
lines terminated by '\r\n';
create table Final(
FNo varchar(10) not null,
TNo varchar(10) not null,
Mark varchar(20) not null,
reward varchar(20) not null,
bingovalue int not null
);
load data infile 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/final.csv'
into table Final
fields terminated by '\,';
#alter table TableRaw add RowNumber int primary key auto_increment; -- 自增字段,用來記錄彩票張數
------------------- 獎票分析 ------------------------------
#1求總中獎張數及金額
select bingovalue from tableraw;
select count(bingovalue) as 中獎總張數, sum(bingovalue) as 中獎總金額
from tableraw
where bingovalue <> 0;
#2求各不同獎幅的張數及金額
select bingovalue as 獎幅, count(bingovalue) as 張數, sum(bingovalue) as 金額
from tableraw
group by bingovalue
having bingovalue <> 0;
#3求中獎張數與總張數佔比,中獎金額與總金額的佔比
set @allcount = (select count(bingovalue) from tableraw);
set @allsum = (select count(bingovalue) * 5 from tableraw);
select count(bingovalue)/@allcount as 中獎張數佔比,
sum(bingovalue)/@allsum as 中獎金額佔比 from tableraw
where bingovalue <> 0;
#4檢查每個本號下有100張彩票
select FNo, count(TNo) from tableraw
group by FNo
having count(TNo) <> 100;
#5檢查每個本號下最多有一張中獎票金額超過50元
select FNo, count(FNo) from tableraw
where bingovalue > 50
group by FNo
having count(FNo)>1;
#6檢查每本彩票中最多連續7張無獎票
#創建bingonumber1
create table bingonumber1 as (
select Rownumber, bingovalue, FNo from tableraw
where bingovalue > 0
order by rownumber);
select * from bingonumber1;
-- drop table bingonumber1; -- 刪除表
#刪除第一條記錄
delete from bingonumber1 limit 1;
alter table bingonumber1 add numberkey int primary key auto_increment; -- 自增
#重新排序
alter table bingonumber1 modify numberkey int first;
#創建bingonumber2
create table bingonumber2 as (
select Rownumber, bingovalue, FNo from tableraw
where bingovalue > 0
order by rownumber);
-- drop table bingonumber2; -- 刪除表
alter table bingonumber2 add numberkey int primary key auto_increment; -- 自增
#重新排序
alter table bingonumber2 modify numberkey int first;
#檢查數據內容及記錄行數
select * from bingonumber1;
select * from bingonumber2;
select count(*) from bingonumber1;
select count(*) from bingonumber2;
#檢查測試結果
select b1.*, b2.*, (b1.rownumber - b2.rownumber) as gap from bingonumber1 as b1, bingonumber2 as b2
where b1.numberkey = b2.numberkey
and b1.FNo = b2.FNo
and (b1.rownumber - b2.rownumber) > 7;