正在寻找SQLZOO NSS教程#8的官方答案的解释

正在寻找SQLZOO NSS教程#8的官方答案的解释,sql,Sql,我在动物园实习时遇到了一个问题。问题如下: #8显示曼彻斯特“Q01”院校的院校、总样本量和计算学生人数。() 我的回答是: SELECT institution,sum(sample),count(DISTINCT ukprn) from nss where institution like '%Manchester%' AND question = 'Q01' AND subject ='(8) Computer Science' Group by institution; 我在互联网上找

我在动物园实习时遇到了一个问题。问题如下:

#8显示曼彻斯特“Q01”院校的院校、总样本量和计算学生人数。()

我的回答是:

SELECT institution,sum(sample),count(DISTINCT ukprn)
from nss
where institution like '%Manchester%'
AND question = 'Q01'
AND subject ='(8) Computer Science'
Group by institution;
我在互联网上找到的正确答案如下:

SELECT institution, SUM(sample), 
(SELECT sample FROM nss y
WHERE subject='(8) Computer Science'
AND x.institution = y.institution
AND question='Q01') AS comp
FROM nss x
WHERE question='Q01'
AND (institution LIKE '%Manchester%')
GROUP BY institution;
我不知道为什么我的条款错了。 为什么在选择部分使用子查询?

提前感谢。

本教程非常糟糕,我花了半个小时才理解一个表的结构和数据,而且这个问题的表述非常糟糕,无论如何,他们真正想看到的是两个数字,首先:

每个机构回答Q01的所有学生的总样本量(总样本量,而不仅仅是计算机科学),可通过以下方式解决:

SELECT institution,sum(sample)
from nss
where institution like '%Manchester%'
AND question = 'Q01'
Group by institution;
现在,第二部分,对于每个机构,他们希望看到回答Q01的计算机科学学生的数量,所以我们可以在查询中添加
case

SELECT institution,sum(sample),sum(case when subject ='(8) Computer Science' then sample else 0 end)
from nss
where institution like '%Manchester%'
AND question = 'Q01'
Group by institution;

这是正确的答案,对于您找到的有关查询的问题,它通过使用子查询在不使用
case
的情况下实现了相同的结果,这也是可能的,但可能会稍微慢一点

问题是您的计算机科学过滤器应用于两个计算值。但你不希望它的样本量

如果我理解这个问题,你想:

select institution, sum(sample),
       count(distinct case when subject = '(8) Computer Science' then ukprn end)
from nss
where institution like '%Manchester%' and 
      question = 'Q01' 
group by institution;
对于这个问题来说,子查询似乎过于复杂

事实上,我猜没有人会多次接受调查,因此对于给定的学生来说没有重复的。在这种情况下,
count(distinct)
只是浪费了开销,因此请使用:

select institution, sum(sample),
       sum(case when subject = '(8) Computer Science' then 1 else 0 end)
from nss
where institution like '%Manchester%' and 
      question = 'Q01' 
group by institution;

我同意你的看法。这个练习太可怕了!我是一个初学者,花了我很长时间,我仍然无法理解它。谢谢你的回答,它更容易理解。我认为我们在实际案例中不会遇到这种问题。无论如何,谢谢你的帮助。