当我在SQLZOO中进行实践时,存在一个问题。问题如下:
#8显示了'Q01‘曼彻斯特机构的机构、样本总数和计算学生人数。(https://sqlzoo.net/wiki/NSS_Tutorial)
我的回答是:
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;我不知道为什么我的条款错了。为什么在SELECT部分使用子查询?
提前谢谢。
发布于 2020-11-20 01:22:24
这个教程太可怕了,我花了半个小时才理解了一个表格的结构和数据,这个问题的表述非常糟糕,不管怎么说,他们真正想看到的是两个数字,首先:
所有学生的总样本量均为每个机构的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,这也是可能的,但可能会稍微慢一点。
发布于 2020-11-20 01:23:31
问题是,计算机科学上的过滤器被应用于这两个计算值。但你不想把它作为样本。
如果我明白这个问题,你想:
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;https://stackoverflow.com/questions/64921991
复制相似问题