A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 chenquanyi626 于 2018-11-15 21:29 编辑

数据库行列转换经典面试题

第一题:


1.1 在数据库中创建表

[SQL] 纯文本查看 复制代码
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `year` varchar(50) DEFAULT NULL,
  `month` int(50) DEFAULT NULL,
  `amount` int(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.2 准备数据
[SQL] 纯文本查看 复制代码
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES ('2011', '1', '1');
INSERT INTO `test` VALUES ('2011', '2', '1');
INSERT INTO `test` VALUES ('2011', '3', '1');
INSERT INTO `test` VALUES ('2011', '4', '1');
INSERT INTO `test` VALUES ('2012', '1', '2');
INSERT INTO `test` VALUES ('2012', '2', '2');
INSERT INTO `test` VALUES ('2012', '3', '2');
INSERT INTO `test` VALUES ('2012', '4', '2');


1.3 答案一
[SQL] 纯文本查看 复制代码
SELECT YEAR,
   SUM(CASE WHEN MONTH='1' THEN amount ELSE 0  END) m1,
   SUM(CASE WHEN MONTH='2' THEN amount ELSE 0  END) m2,
   SUM(CASE WHEN MONTH='3' THEN amount ELSE 0  END) m3,
   SUM(CASE WHEN MONTH='4' THEN amount ELSE 0  END) m4
   FROM abc GROUP BY YEAR


1.4 答案二
[SQL] 纯文本查看 复制代码
SELECT
        year as 'year',
        MAX(CASE `month` WHEN '1' THEN amount ELSE 0 END) AS 'm1',
        MAX(CASE `month` WHEN '2' THEN amount ELSE 0 END) as 'm2',
        MAX(CASE `month` WHEN '3' THEN amount ELSE 0 END) as 'm3',
        max(case `month` when '4' then amount else 0 end ) as 'm4'
FROM
        test
GROUP BY
        year
ORDER BY year;


1.5 答案三
[SQL] 纯文本查看 复制代码
select  a.year year,a.amount m1,b.amount m2,c.amount m3,d.amount m4 from
test a,test b,test c,test d
where a.month=1 and b.month=2 and c.month=3 and d.month=4 and a.year=b.year
and b.year=c.year and c.year=d.year;

=====================================================================


第二题:

2.1 在数据库中创建表
[SQL] 纯文本查看 复制代码
-- ----------------------------
-- Table structure for `teacher`
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `week` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  `hasCourse` varchar(50) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

2.2 准备数据
[SQL] 纯文本查看 复制代码
-- ----------------------------
-- Records of teacher
-- ----------------------------
INSERT INTO `teacher` VALUES ('1', '李彦宏', '星期二', '有');
INSERT INTO `teacher` VALUES ('2', '李彦宏', '星期三', '有');
INSERT INTO `teacher` VALUES ('3', '马云', '星期一', '有');
INSERT INTO `teacher` VALUES ('4', '马化腾', '星期二', '有');
INSERT INTO `teacher` VALUES ('5', '李彦宏', '星期二', '有');

2.3 答案一
[SQL] 纯文本查看 复制代码
mysql> SELECT NAME 教师姓名,
SUM(CASE WHEN WEEK='星期一' AND hasCourse='有' THEN 1 ELSE NULL END) 星期一,
SUM(CASE WHEN WEEK='星期二' AND hasCourse='有' THEN 1 ELSE NULL END) 星期二,
SUM(CASE WHEN WEEK='星期三' AND hasCourse='有' THEN 1 ELSE NULL END) 星期三
FROM teacher
GROUP BY 教师姓名;
+----------+--------+--------+--------+
| 教师姓名 | 星期一 | 星期二 | 星期三 |
+----------+--------+--------+--------+
| 李彦宏   | NULL   | 2      | 1      |
| 马云     | 1      | NULL   | NULL   |
| 马化腾   | NULL   | 1      | NULL   |
+----------+--------+--------+--------+
3 rows in set

2.4 答案二
[SQL] 纯文本查看 复制代码
mysql> SELECT a.name AS '姓名',
(SELECT COUNT(1) FROM teacher b WHERE b.week = '星期一' AND b.hasCourse='有' AND b.name=a.name)AS '星期一',
(SELECT COUNT(1) FROM teacher c WHERE c.week='星期二' AND c.hasCourse='有'AND c.name=a.name)AS '星期二',
(SELECT COUNT(1) FROM teacher d WHERE d.week='星期三' AND d.hasCourse='有'AND d.name=a.name)AS '星期三' 
FROM teacher a GROUP BY NAME;
+--------+--------+--------+--------+
| 姓名   | 星期一 | 星期二 | 星期三 |
+--------+--------+--------+--------+
| 李彦宏 |      0 |      2 |      1 |
| 马云   |      1 |      0 |      0 |
| 马化腾 |      0 |      1 |      0 |
+--------+--------+--------+--------+
3 rows in set


2.5 答案三
[SQL] 纯文本查看 复制代码
select  temp.name as 姓名, (temp.星期一) ,sum(temp.星期二)as 星期二,
sum(temp.星期三)as 星期三 from 
(select name,
ifnull(week like '星期一',null)as 星期一 ,
ifnull(week like '星期二',null) as 星期二,
ifnull(week like '星期三',null) as 星期三 from teacher) 
temp group by temp.name;

+--------+--------+--------+--------+
| 姓名   | 星期一 | 星期二 | 星期三 |
+--------+--------+--------+--------+
| 李彦宏 |      0 | 2      | 1      |
| 马云   |      1 | 0      | 0      |
| 马化腾 |      0 | 1      | 0      |
+--------+--------+--------+--------+
3 rows in set



1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马