Sql 外部查询和子查询中使用的计数和分组函数
我编写了一个查询,其中包括创建一个表中的总和数字和值百分比(转储到一行)。每个子查询的WHERE参数略有不同。例如:Sql 外部查询和子查询中使用的计数和分组函数,sql,sql-server,Sql,Sql Server,我编写了一个查询,其中包括创建一个表中的总和数字和值百分比(转储到一行)。每个子查询的WHERE参数略有不同。例如: select distinct count(KS2_PupilMatchingRefAnonymous) AS 'Total Pupils', (select count(KS2_PupilMatchingRefAnonymous) from KS2_CandInd_2011 where KS2_MMSCH=1 an
select distinct
count(KS2_PupilMatchingRefAnonymous) AS 'Total Pupils',
(select count(KS2_PupilMatchingRefAnonymous)
from KS2_CandInd_2011
where KS2_MMSCH=1
and KS2_ELIGENGTA=1) AS 'All Eligible Pupils',
(select count(*)
from KS2_CandInd_2011
where KS2_MMSCH=1
and KS2_ELIGENGTA=1
and KS2_ELIGENGTA=1
and FSMeligible=1) AS 'Eligible FSM only',
(select round(
(cast((
select count(*)
from KS2_CandInd_2011
where KS2_MMSCH=1
and KS2_ELIGENGTA=1
and KS2_ELIGENGTA=1
and FSMeligible=1) AS float) /
cast((
select count(KS2_PupilMatchingRefAnonymous)
from KS2_CandInd_2011
where KS2_MMSCH=1
and KS2_ELIGENGTA=1) AS float))*100,2
)) AS '% Eligible FSM'
from KS2_CandInd_2011
where KS2_MMSCH=1
现在,我希望根据性别使用计数(当然还有分组依据)对每个子查询进行细分。如果将性别的计数/分组依据放在外部查询中,我只会得到“学生总数”值的细分/拆分
如果我试图在子查询中输入相同的子句,我会被告知
Msg 116,16级,状态1,第12行
当子查询未引入EXISTS时,只能在选择列表中指定一个表达式
根据一个相关的子查询,内部查询并没有真正引用外部查询,所以尽管我做了最好的尝试,我还是不确定如何克服这个错误。有人有什么建议吗?我们可以用如下所示的更简单的方式重新编写您的查询。(假设您的表中有一个名为
gender
的列:KS2\u CandInd\u 2011
select
a.gender
,count(*) AS 'Total Pupils',
,sum(case
when KS2_MMSCH=1 and KS2_ELIGENGTA=1 then 1
else 0
end
) as 'All Eligible Pupils'
,sum(case
when KS2_MMSCH=1 and KS2_ELIGENGTA=1 and KS2_ELIGENGTA=1 and FSMeligible=1 then 1
else 0
end) as 'Eligible FSM only'
,round(cast( sum(case
when KS2_MMSCH=1 and KS2_ELIGENGTA=1 then 1
else 0
end
) as float)/
cast(sum(case
when KS2_MMSCH=1 and KS2_ELIGENGTA=1 and KS2_ELIGENGTA=1 and FSMeligible=1 then 1
else 0
end) as float)
*100,2) AS '% Eligible FSM'
from KS2_CandInd_2011 as a
where a.KS2_MMSCH=1
group by a.gender
order by a.gender;
我相信以下内容将为您提供原始查询的准确输出:
select
,count(*) AS 'Total Pupils',
,sum(case
when KS2_MMSCH=1 and KS2_ELIGENGTA=1 then 1
else 0
end
) as 'All Eligible Pupils'
,sum(case
when KS2_MMSCH=1 and KS2_ELIGENGTA=1 and KS2_ELIGENGTA=1 and FSMeligible=1 then 1
else 0
end) as 'Eligible FSM only'
,round(cast( sum(case
when KS2_MMSCH=1 and KS2_ELIGENGTA=1 then 1
else 0
end
) as float)/
cast(sum(case
when KS2_MMSCH=1 and KS2_ELIGENGTA=1 and KS2_ELIGENGTA=1 and FSMeligible=1 then 1
else 0
end) as float)
*100,2) AS '% Eligible FSM'
from KS2_CandInd_2011 as a
where a.KS2_MMSCH=1
;
是的!这是有效的,尽管百分比值有点低(558%!),但我可以解决这个问题。我想关键是使用SUM而不是COUNT,然后呢?非常感谢!当我必须计算东西时,我总是使用上述构造,但基于各种条件。如果这解决了您的问题,那么您可以通过单击勾号图标将其作为有效答案接受。