![](https://ask.qcloudimg.com/http-save/yehe-8223537/41b3bd059e64f31aef14e444b3a3b050.jpg)
之前面试遇到一个sql题。当时没写出sql语句,把题目记下。现在分享给大家(知识贵在精,学会举一反三)。
![](https://ask.qcloudimg.com/http-save/yehe-8223537/e76b54152c7886dc407db2ce8363c863.jpg)
![](https://ask.qcloudimg.com/http-save/yehe-8223537/cc06deef80a37f27a5fca484f2a32325.jpg)
这里采用的是mysql.sql语句如下。
![](https://ask.qcloudimg.com/http-save/yehe-8223537/c0ca4147b6d64d5a90de2b97860bd502.jpg)
DROP TABLE IF EXISTS `depart_month`;
CREATE TABLE `depart_month` (
`id` int(11) NOT NULL AUTO_INCREMENT,//id自增长
`depart` int(11) DEFAULT NULL, //部门id
`achive` decimal(10,0) DEFAULT NULL,//业绩
`status` int(11) DEFAULT NULL,//状态 此处不需要。
`month` varchar(59) DEFAULT NULL,//月份
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
//记录
INSERT INTO `depart_month` VALUES ('1', '1', '10', '1', '一月');
INSERT INTO `depart_month` VALUES ('2', '2', '10', '1', '一月');
INSERT INTO `depart_month` VALUES ('3', '3', '5', '1', '一月');
INSERT INTO `depart_month` VALUES ('4', '2', '8', '1', '二月');
INSERT INTO `depart_month` VALUES ('5', '4', '9', '1', '二月');
INSERT INTO `depart_month` VALUES ('6', '3', '8', '1', '三月');
其实第二个table只是用来显示对应部门的名字。在此题中没有作用(因为结果没有显示部门名称,直接显示的是id).
当时我的想法是,肯定是要group by ‘部门’,并且业绩应该是要sum(yj)求和的。但如何显示一月,二月,三月,想了很久后就决定放弃了。
现在来想,当时的想法是对的,只是如何来解决显示一月,二月,三月的问题。
其实我们可以将一月,二月,三月分开。先查看部门和一月的数据,然后用部门来关联二月的数据,三月的数据。最后汇总即可。
一:首先查看部门和一月数据.
SELECT t.depart AS '部门',t1.one AS '一月'
FROM (SELECT depart FROM depart_month GROUP BY depart) t
LEFT JOIN (SELECT depart,sum(achive) AS 'one' FROM depart_month WHERE MONTH = '一月'
GROUP BY depart) t1 ON t.depart = t1.depart
效果如下
二:上面的数据然后加上二月的数据
SELECT t.depart AS '部门',t1.one AS '一月',t2.two AS '二月'
FROM ( SELECT depart FROM depart_month GROUP BY depart) t
LEFT JOIN (SELECT depart,sum(achive) AS 'one' FROM depart_month
WHERE MONTH = '一月' GROUP BY depart) t1 ON t.depart = t1.depart
LEFT JOIN (SELECT depart,sum(achive) AS 'two' FROM depart_month
WHERE MONTH = '二月' GROUP BY depart) t2 ON t.depart = t2.depart
效果如下:
三:最后关联三月的数据。
SELECT t.depart AS '部门',t1.one AS '一月',t2.two AS '二月',t3.three AS '三月'
FROM ( SELECT depart FROM depart_month GROUP BY depart) t LEFT JOIN (
SELECT depart,sum(achive) AS 'one' FROM depart_month WHERE MONTH = '一月' GROUP BY
depart) t1 ON t.depart = t1.depart LEFT JOIN ( SELECT depart,sum(achive) AS 'two'
FROM depart_month WHERE MONTH = '二月' GROUP BY depart) t2 ON t.depart = t2.depart
LEFT JOIN (SELECT depart,sum(achive) AS 'three' FROM depart_month WHERE MONTH = '三月'
GROUP BY depart ) t3 ON t.depart = t3.depart ORDER BY t.depart
效果:
总结:我个人觉得难点是处理月份上,如果分开就好多了。我觉得应该还有更好更简单的sql.如果有,欢迎来提建议。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/120681.html