MySQL实现显示百分比显示和前百分之几的方法

前几天一个朋友让我帮忙写的,随手记录一下,感觉难度也不大,就是写的时候遇到一些问题。优化方便做得不太好。有好的优化方法欢迎分享!(数据库在文章结尾)

要求

1)查询所有时间内,所有产品销售金额占比,按占比大小降序排序,筛选累计占比在前80%的产品,结果输出排名产品名称销售金额占比累计占比。

2)查询所有时间内,各个国家的销售情况,销售合计金额大于10000视为业绩合格,

否则为不合格,结果输出国家销售金额业绩情况。

3)查询中国、英国每个月份的销售情况,2020年8月份销售合计金额大于10000视为业绩合格,否则为不合格,2020年9月份销售合计金额大于12000视为业绩合格,否则为不合格,结果输出月份中国销售业绩、英国销售业绩。

实现代码

1)

select a.productid 产品id,(a.sale_amount * b.price) 销售金额,concat((a.sale_amount * b.price / (select sum(aa.sale_amount * bb.price) m from 2002a aa left join 2002b bb on aa.productid = bb.productid)) * 100,"%") percent 
from (select @rownum:=0) r,2002a a,2002b b 
where (@rownum:=@rownum+1)<=(select round(count(distinct a.productid)*0.8) from 2002a a, 2002b b where a.productid = b.productid) 
and a.productid = b.productid group by a.productid order by (a.sale_amount * b.price) desc;

2)

select country 国家,sum(price*sale_amount) 销售金额,if(sum(price*sale_amount)>10000,'合格','不合格') 业绩情况 
from 2002a a,2002b b,2002c c where a.productid=b.productid and a.customid=c.customid group by country;

3)

select date_format(ztime,'%y-%m') 月份,sum(price*sale_amount) 销售金额,
if((date_format(ztime,'%y-%m')='2020-08' and sum(price*sale_amount)>10000) or (date_format(ztime,'%y-%m')='2020-09' and sum(price*sale_amount)>13000) and country='中国','合格','不合格') 中国销售业绩,
if((date_format(ztime,'%y-%m')='2020-08' or sum(price*sale_amount)>10000) and (date_format(ztime,'%y-%m')='2020-09' and sum(price*sale_amount)>13000) and country='英国','合格','不合格') 英国销售业绩 
from 2002a a,2002b b,2002c c 
where a.productid=b.productid and a.customid=c.customid and country in('中国','英国') and (date_format(ztime,'%y-%m')='2020-09' or date_format(ztime,'%y-%m')='2020-08') group by date_format(ztime,'%y-%m');

实现查询结果显示前百分之八十的方法:

实现百分比显示:

首先认识两个函数concat()和left()、truncate(a,b)

concat(str1,str2,…)拼接字符串,返回来自于参数连结的字符串。如果任何参数是null, 返回null。可以拼接多个。

left(str,length)从左开始截取字符串.说明:left(被截取字段,截取长度)

truncate(a,b)返回被舍去至小数点后b位的数字a。若b的值为0,则结果不带有小数点或不带有小数部分。可以将b设为负数,若要截去(归零)a小数点左起第b位开始后面所有低位的值.,所有数字的舍入方向都接近于零

结合一下(我上面的代码没使用left):concat ( left (数值1 / 数值2 *100,5),’%’) as 投诉率

示例:

select id,concat(truncate(passscore / (danscore+panscore+duoscore) *100,2),'%') as 成绩与总分比 
from aqsc_kaoshi_record;

实现mysql查询前百分之几的数据(这里是80%)

mysql不支持top和rowid,使用limit的方式也行不通。所以使用下面这种方式:

select a.* 
from (select @rownum:=0) r,2002a a 
where (@rownum:=@rownum+1)<=(select round(count(*)*0.8) from 2002a); 

这里的rownum只是个变量名,也可以是用其他的

将student表的grade从大到小排序后的前20%案例:

select @rownum:=@rownum+1,student.* 
from (select @rownum:=0) row ,(select * from student order by student.grade desc) student ##排序
where @rownum<(select round(count(*)/4) from student) 

除了if外实现判断显示的示例:

select 
       sum(case when sex = '男' then 1 else 0 end)   /* 这是求男生人数 */
       sum(case when sex = '女' then 1 else 0 end)   /* 这是求女生人数 */
from student

数据库

以下是数据库完整代码:

/*
navicat mysql data transfer
source server         : first
source server version : 80011
source host           : localhost:3306
source database       : fr_test_sql
target server type    : mysql
target server version : 80011
file encoding         : 65001
date: 2021-12-18 16:06:19
*/
set foreign_key_checks=0;
-- ----------------------------
-- table structure for `2002a`
-- ----------------------------
drop table if exists `2002a`;
create table `2002a` (
`orderid` varchar(255) not null,
`ztime` date not null,
`productid` varchar(255) not null,
`sale_amount` int(11) not null,
`customid` varchar(255) not null,
primary key (`orderid`)
) engine=innodb default charset=utf8;
-- ----------------------------
-- records of 2002a
-- ----------------------------
insert into `2002a` values ('o001', '2020-09-10', 'p010', '96', 'c008');
insert into `2002a` values ('o002', '2020-08-29', 'p008', '38', 'c007');
insert into `2002a` values ('o003', '2020-08-10', 'p007', '97', 'c008');
insert into `2002a` values ('o004', '2020-09-27', 'p005', '62', 'c006');
insert into `2002a` values ('o005', '2020-08-17', 'p007', '37', 'c009');
insert into `2002a` values ('o006', '2020-09-06', 'p006', '3', 'c005');
insert into `2002a` values ('o007', '2020-08-30', 'p009', '86', 'c007');
insert into `2002a` values ('o008', '2020-09-04', 'p001', '34', 'c007');
insert into `2002a` values ('o009', '2020-09-09', 'p003', '99', 'c004');
insert into `2002a` values ('o010', '2020-09-06', 'p002', '65', 'c010');
insert into `2002a` values ('o011', '2020-08-08', 'p005', '11', 'c002');
insert into `2002a` values ('o012', '2020-09-20', 'p002', '3', 'c008');
insert into `2002a` values ('o013', '2020-08-15', 'p004', '9', 'c004');
insert into `2002a` values ('o014', '2020-08-28', 'p007', '99', 'c010');
insert into `2002a` values ('o015', '2020-08-23', 'p003', '3', 'c005');
insert into `2002a` values ('o016', '2020-08-08', 'p006', '51', 'c008');
insert into `2002a` values ('o017', '2020-09-04', 'p009', '99', 'c002');
insert into `2002a` values ('o018', '2020-08-12', 'p007', '86', 'c003');
insert into `2002a` values ('o019', '2020-09-22', 'p001', '73', 'c005');
insert into `2002a` values ('o020', '2020-08-03', 'p009', '22', 'c006');
insert into `2002a` values ('o021', '2020-08-22', 'p007', '54', 'c006');
insert into `2002a` values ('o022', '2020-09-29', 'p005', '59', 'c005');
insert into `2002a` values ('o023', '2020-08-15', 'p003', '45', 'c006');
insert into `2002a` values ('o024', '2020-09-12', 'p001', '10', 'c004');
insert into `2002a` values ('o025', '2020-08-23', 'p004', '56', 'c008');
insert into `2002a` values ('o026', '2020-09-17', 'p003', '57', 'c004');
insert into `2002a` values ('o027', '2020-08-23', 'p002', '73', 'c003');
insert into `2002a` values ('o028', '2020-09-22', 'p003', '50', 'c008');
insert into `2002a` values ('o029', '2020-09-22', 'p003', '70', 'c007');
insert into `2002a` values ('o030', '2020-08-13', 'p006', '15', 'c002');
-- ----------------------------
-- table structure for `2002b`
-- ----------------------------
drop table if exists `2002b`;
create table `2002b` (
`productid` varchar(255) character set utf8 collate utf8_general_ci not null,
`productname` varchar(255) character set utf8 collate utf8_general_ci not null,
`price` decimal(10,0) not null,
primary key (`productid`)
) engine=innodb default charset=utf8;
-- ----------------------------
-- records of 2002b
-- ----------------------------
insert into `2002b` values ('p001', '产品a', '29');
insert into `2002b` values ('p002', '产品b', '50');
insert into `2002b` values ('p003', '产品c', '42');
insert into `2002b` values ('p004', '产品d', '59');
insert into `2002b` values ('p005', '产品e', '49');
insert into `2002b` values ('p006', '产品f', '10');
insert into `2002b` values ('p007', '产品g', '23');
insert into `2002b` values ('p008', '产品h', '24');
insert into `2002b` values ('p009', '产品i', '50');
insert into `2002b` values ('p010', '产品j', '64');
-- ----------------------------
-- table structure for `2002c`
-- ----------------------------
drop table if exists `2002c`;
create table `2002c` (
`customid` varchar(255) character set utf8 collate utf8_general_ci not null,
`customname` varchar(255) not null,
`country` varchar(255) not null,
primary key (`customid`)
) engine=innodb default charset=utf8;
-- ----------------------------
-- records of 2002c
-- ----------------------------
insert into `2002c` values ('c001', '客户a', '中国');
insert into `2002c` values ('c002', '客户b', '法国');
insert into `2002c` values ('c003', '客户c', '中国');
insert into `2002c` values ('c004', '客户d', '英国');
insert into `2002c` values ('c005', '客户e', '美国');
insert into `2002c` values ('c006', '客户f', '中国');
insert into `2002c` values ('c007', '客户g', '法国');
insert into `2002c` values ('c008', '客户h', '英国');
insert into `2002c` values ('c009', '客户i', '美国');
insert into `2002c` values ('c010', '客户h', '英国');
-- ----------------------------
-- table structure for `2003_a`
-- ----------------------------
drop table if exists `2003_a`;
create table `2003_a` (
`classno` varchar(255) default null,
`studentno` varchar(255) default null,
`grade` varchar(255) default null
) engine=innodb default charset=utf8;
-- ----------------------------
-- records of 2003_a
-- ----------------------------
insert into `2003_a` values ('class1', '1001', '86');
insert into `2003_a` values ('class1', '1002', '60');
insert into `2003_a` values ('class1', '1003', '85');
insert into `2003_a` values ('class1', '1004', '73');
insert into `2003_a` values ('class1', '1005', '95');
insert into `2003_a` values ('class1', '1006', '61');
insert into `2003_a` values ('class1', '1007', '77');
insert into `2003_a` values ('class1', '1008', '71');
insert into `2003_a` values ('class1', '1009', '61');
insert into `2003_a` values ('class1', '1010', '78');
insert into `2003_a` values ('class2', '2001', '81');
insert into `2003_a` values ('class2', '2002', '54');
insert into `2003_a` values ('class2', '2003', '57');
insert into `2003_a` values ('class2', '2004', '75');
insert into `2003_a` values ('class2', '2005', '98');
insert into `2003_a` values ('class2', '2006', '75');
insert into `2003_a` values ('class2', '2007', '76');
insert into `2003_a` values ('class2', '2008', '58');
insert into `2003_a` values ('class2', '2009', '73');
insert into `2003_a` values ('class2', '2010', '55');
insert into `2003_a` values ('class3', '3001', '42');
insert into `2003_a` values ('class3', '3002', '90');
insert into `2003_a` values ('class3', '3003', '81');
insert into `2003_a` values ('class3', '3004', '97');
insert into `2003_a` values ('class3', '3005', '68');
insert into `2003_a` values ('class3', '3006', '72');
insert into `2003_a` values ('class3', '3007', '81');
insert into `2003_a` values ('class3', '3008', '79');
insert into `2003_a` values ('class3', '3009', '87');
insert into `2003_a` values ('class3', '3010', '59');
-- ----------------------------
-- table structure for `2004_a`
-- ----------------------------
drop table if exists `2004_a`;
create table `2004_a` (
`tyear` varchar(255) default null,
`tmonth` varchar(255) default null,
`sale_money` varchar(255) default null
) engine=innodb default charset=utf8;
-- ----------------------------
-- records of 2004_a
-- ----------------------------
insert into `2004_a` values ('2019', '10', '1279');
insert into `2004_a` values ('2019', '11', '2316');
insert into `2004_a` values ('2019', '12', '2090');
insert into `2004_a` values ('2020', '01', '1086');
insert into `2004_a` values ('2020', '02', '2046');
insert into `2004_a` values ('2020', '03', '0');
insert into `2004_a` values ('2020', '04', '2959');
insert into `2004_a` values ('2020', '05', '1314');
insert into `2004_a` values ('2020', '06', '2751');
insert into `2004_a` values ('2020', '07', '1492');
insert into `2004_a` values ('2020', '08', '1414');
insert into `2004_a` values ('2020', '09', '2895');
insert into `2004_a` values ('2020', '10', '2999');
insert into `2004_a` values ('2020', '11', '1982');
insert into `2004_a` values ('2020', '12', '2793');
insert into `2004_a` values ('2021', '01', '2156');
insert into `2004_a` values ('2021', '02', '1733');
insert into `2004_a` values ('2021', '03', '2184');
-- ----------------------------
-- table structure for `t_user`
-- ----------------------------
drop table if exists `t_user`;
create table `t_user` (
`user_id` int(11) not null auto_increment comment '编号',
`user_access` varchar(20) not null default '' comment '账号',
`user_token` varchar(20) not null default '123456' comment '密码',
`user_nick` varchar(20) not null default '虾米' comment '昵称',
`user_gender` bit(1) not null default b'1' comment '1为男,0为女',
`user_hobbies` varchar(20) not null comment '爱好',
`user_type` int(1) not null default '1' comment '类型',
primary key (`user_id`),
unique key `uk_user_access` (`user_access`) using btree
) engine=innodb auto_increment=7 default charset=utf8;
-- ----------------------------
-- records of t_user
-- ----------------------------
insert into `t_user` values ('1', 'cqswxy', '111111', '重庆商务', '', '编程,游戏', '3');
insert into `t_user` values ('2', 'zjczjc', '222222', '俊采星驰', '', '编程,学习', '2');
insert into `t_user` values ('3', 'cetoox', '333333', '光速为零', '', '游戏,学习', '1');
insert into `t_user` values ('4', 'xxx', '23', 'xxx', '', 'xxxx', '1');
insert into `t_user` values ('6', 'dasda', '123456', '虾米', '', 'asd', '5');
-- ----------------------------
-- table structure for `t_user_type`
-- ----------------------------
drop table if exists `t_user_type`;
create table `t_user_type` (
`user_type_id` int(11) not null auto_increment,
`user_type_name` varchar(2) not null,
primary key (`user_type_id`)
) engine=innodb auto_increment=5 default charset=utf8;
-- ----------------------------
-- records of t_user_type
-- ----------------------------
insert into `t_user_type` values ('1', '菜鸟');
insert into `t_user_type` values ('2', '高手');
insert into `t_user_type` values ('3', '传说');
insert into `t_user_type` values ('4', '普通');

以上就是mysql实现显示百分比显示和前百分之几的方法的详细内容,更多关于mysql 百分比显示的资料请关注www.887551.com其它相关文章!

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐