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.如果有,歡迎來提建議。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章