常见sql 面试题

之前面试遇到一个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.如果有,欢迎来提建议。

 

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值