0

単一のテーブルに保持されている (単一の行にダンプされた) 値の合計とパーセンテージの作成を含むクエリを作成しました。各サブクエリは、WHERE パラメータに関してわずかに異なります。例えば:

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

性別に応じて、各サブクエリを COUNT (およびもちろん GROUP BY) で分類したいと考えています。性別の COUNT/GROUP BY が外側のクエリに配置されている場合、「合計生徒」値の内訳/分割のみが取得されます。

サブクエリに同じ句を入力しようとすると、

メッセージ 116、レベル 16、状態 1、行 12 サブクエリが EXISTS で導入されていない場合、選択リストに指定できる式は 1 つだけです。

相関サブクエリのように、内側のクエリは実際には外側のクエリを参照していないため、最善を尽くしてもエラーを克服する方法がわかりません。誰か提案はありますか?

4

1 に答える 1

0

以下に示すように、クエリをより簡単な方法で書き直すことができます (genderテーブルに次の列があると仮定します。KS2_CandInd_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
;
于 2013-10-09T13:56:12.480 に答える