前言
前两天遇到写sql语句的问题。想了很久,没有解决出来。然后,请教大佬。解决了。。。好吧,话不多说,开始解决吧
准备数据库
CREATE DATABASE /*!32312 IF NOT EXISTS*/`school` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `school`;
/*Table structure for table `deptkpi` */
DROP TABLE IF EXISTS `deptkpi`;
CREATE TABLE `deptkpi` (
`MonthName` varchar(50) NOT NULL,
`DeptName` varchar(50) NOT NULL,
`KPIValue` int(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Data for the table `deptkpi` */
insert into `deptkpi`(`MonthName`,`DeptName`,`KPIValue`) values ('一月','市场部',8000),('二月','信息中心',1500),('一月','信息中心',1000),('二月','市场部',8765),('三月','市场部',90555),('三月','信息中心',800),('四月','市场部',86890),('四月','信息中心',1113),('五月','市场部',78990),('五月','信息中心',3211),('六月','市场部',99999),('六月','信息中心',40000);
在navicat上执行完后就是这样:
看题目要求
- 我们通过这一张表查询出这两个部门的最大业绩,最大业绩月份,最小业绩月份,总业绩占比
- 将这个条件分成几个部分查询出来,然后,根据关联关系合并数据
开始动手
-
先查询出 部门的最大业绩及最大业绩月份
SELECT deptName,KPIValue '最大业绩kpi',MONTHNAME '最大业绩月份' FROM deptkpi WHERE KPIValue IN (SELECT MAX(KPIValue) FROM deptkpi GROUP BY DeptName)
-
查询出部门的最小业绩,最小业绩月份
SELECT deptName,KPIValue '最小业绩kpi',MONTHNAME '最小业绩月份' FROM deptkpi WHERE KPIValue IN (SELECT MIN(KPIValue) FROM deptkpi GROUP BY DeptName)
-
查询各个部门占总的比例
SELECT deptName,SUM(KPIValue)/(SELECT SUM(KPIValue) FROM deptkpi) AS '总业绩占比' FROM deptkpi GROUP BY deptName
-
这样就出来三条sql语句,他们的关系都有
deptName
这一列,所以,我们这里使用内连接的方法组合SELECT l.*,s.最小业绩kpi,s.最小业绩月份,z.总业绩占比 FROM ( SELECT deptName,KPIValue '最大业绩kpi',MONTHNAME '最大业绩月份' FROM deptkpi WHERE KPIValue IN (SELECT MAX(KPIValue) FROM deptkpi GROUP BY DeptName) ) l INNER JOIN ( SELECT deptName,KPIValue '最小业绩kpi',MONTHNAME '最小业绩月份' FROM deptkpi WHERE KPIValue IN (SELECT MIN(KPIValue) FROM deptkpi GROUP BY DeptName) ) s ON l.deptName = s.deptName INNER JOIN ( SELECT deptName,SUM(KPIValue)/(SELECT SUM(KPIValue) FROM deptkpi) AS '总业绩占比' FROM deptkpi GROUP BY deptName ) z ON s.deptName = z.deptName
运行结果如下图:
我的问题是出在查询的字段中还可以写查询语句。这点我不清楚,所以最后没有做出来。百度的话,那些sql更加看不懂。
如果有更好的方法,欢迎指正!