MySQL彩票分析

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章