首页 > 数据库技术 > 详细

一道经典的SQL面试题

时间:2015-11-19 07:00:57      阅读:320      评论:0      收藏:0      [点我收藏+]

还是公司同事出的面试题,题目:统计胜负结果

A表:

date result

2015-11-18 胜

2015-11-18 负

2015-11-18 胜

2015-11-17 胜

2015-11-17 负

查询出来的结果:

date ???? 胜 ????负

2015-11-18 ????2 ????1

2015-11-17 ????1 ????1

正巧不久前去面一家公司也刚好考到这个题,查出来的结果还比这个难一点。

id????date ???? 胜 ???? 负

1????2015-11-18 ???? 2 ????1

2????2015-11-17 ????1 ????1

大体思路是差不多的,这里给出几种解决方法。

一、采用子查询

SELECT date,

(SELECT COUNT(*) FROM A WHERE date=outtable.date and result=`胜`) AS `胜`,

(SELECT COUNT(*) FROM A WHERE date=outtable.date and result=`负`) AS `负`

FROM A AS outtable

GROUP BY date

ORDER BY date DESC

????

二、子查询结果作为两个新表,使用where进行关联

????SELECT a1.date AS date,a1.num AS ‘胜‘,a2.num AS ‘负‘ FROM

(SELECT date, count(*) AS num FROM A WHERE result=‘胜‘ GROUP BY date) AS a1,

(SELECT date, count(*) AS num FROM A WHERE result=‘负‘ GROUP BY date) AS a2

WHERE a1.date=a2.date

ORDER BY date DESC

?

三、子查询结果作为两个新表,使用join进行表关联

????SELECT a1.date AS date,a1.num AS ‘胜‘,a2.num AS ‘负‘ FROM

(SELECT date, count(*) AS num FROM A WHERE result=‘胜‘ GROUP BY date) AS a1

INNER JOIN

(SELECT date, count(*) AS num FROM A WHERE result=‘负‘ GROUP BY date) AS a2

ON a1.date=a2.date

ORDER BY date DESC

?

如何在查询结果中加id呢?

在SQL Sever下可使用id=identity(int,1,1),但在MySQL下这种方法似乎不行,那么我们采用下面这种方法:

SET @cout=0;

SELECT (@cout:=@cout+1) AS id,a1.date AS date,a1.num AS ‘胜‘,a2.num AS ‘负‘ FROM

(SELECT date, count(*) AS num FROM A WHERE result=‘胜‘ GROUP BY date ORDER BY date DESC) AS a1,

(SELECT date, count(*) AS num FROM A WHERE result=‘负‘ GROUP BY date ORDER BY date DESC) AS a2

WHERE a1.date=a2.date

ORDER BY date DESC;

这种方法在MySQL下简单快捷,但是在第一种查询下使用结果不尽如人意。

一道经典的SQL面试题

原文:http://www.cnblogs.com/xdwy/p/4976452.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!