常见SQL面试题_sql索引面试题

常见SQL面试题_sql索引面试题之前面试遇到一个 sql 题 当时没写出 sql 语句 把题目记下 现在分享给大家 知识贵在精 学会举一反三 这里采用的是 mysql sql 语句如下 DROP TABLE IF EXISTS depart month CREATE TABLE depart month id int 11 NOT NULL AUTO INCREMENT id 自增长 depart

之前面试遇到一个sql题。当时没写出sql语句,把题目记下。现在分享给大家(知识贵在精,学会举一反三)。

这里采用的是mysql.sql语句如下。

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.如果有,欢迎来提建议。

编程小号
上一篇 2025-01-29 13:30
下一篇 2025-01-25 17:40

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/120681.html