表: Experiments
Column Name | Type |
---|---|
experiment_id | int |
platform | enum |
experiment_name | enum |
experiment_id 是这个表的主键.
platform 是枚举类型的,取值是这三种 (‘Android’, ‘IOS’, ‘Web’) 之一.
experiment_name 也是枚举类型的,取值是这三种 (‘Reading’, ‘Sports’, ‘Programming’) 之一.
这个表包含有关随机实验人员进行的实验的 ID、用于做实验的平台以及实验名称的信息。
问题
写一个 SQL 查询语句,以报告在给定三个实验平台中每种实验完成的次数。请注意,每一对(实验平台、实验名称)都应包含在输出中,包括平台上实验次数是零的。
结果可以以任意顺序给出。
示例:
输入:
Experiments table
experiment_id | platform | experiment_name |
---|---|---|
4 | IOS | Programming |
13 | IOS | Sports |
14 | Android | Reading |
8 | Web | Reading |
12 | Web | Reading |
18 | Web | Programming |
输出:
platform | experiment_name | num_experiments |
---|---|---|
Android | Reading | 1 |
Android | Sports | 0 |
Android | Programming | 0 |
IOS | Reading | 0 |
IOS | Sports | 1 |
IOS | Programming | 1 |
Web | Reading | 2 |
Web | Sports | 0 |
Web | Programming | 1 |
解释:
在安卓平台上, 我们只做了一个"Reading" 实验.
在 “IOS” 平台上,我们做了一个"Sports" 实验和一个"Programming" 实验.
在 “Web” 平台上,我们做了两个"Reading" 实验和一个"Programming" 实验.
解答——一定要自己创建字段新建表
分组统计,数据为空时,显示为0,所以不用ifnull()
select
a.platform
,b.experiment_name
,count(c.experiment_id) num_experiments
from
(select 'Android' platform
union
select 'IOS'
union
select 'Web') a
cross join
(select 'Reading' experiment_name
union
select 'Sports'
union
select 'Programming') b
left join
Experiments c on a.platform=c.platform and
b.experiment_name=c.experiment_name
group by a.platform,b.experiment_name
错误代码
SELECT a.platform,
b.experiment_name,
ifnull(count(c.experiment_id),0) as num_experiments
FROM
(SELECT DISTINCT experiment_name
FROM Experiments) AS b
CROSS JOIN
(SELECT DISTINCT platform
FROM Experiments )AS a
LEFT JOIN Experiments AS c ON a.platform = c.platform
AND b.experiment_name = c.experiment_name
GROUP BY a.platform,b.experiment_name
ORDER BY a.platform,b.experiment_name