一道经典的SQL面试题

时间:2021-07-26 14:21:52

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

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下简单快捷,但是在第一种查询下使用结果不尽如人意。