2013-10-09 61 views
0

我寫了一個查詢,它涉及創建一個表中的總數值和百分比(轉儲到單個行)。每個子查詢對於WHERE參數略有不同。例如:在外部查詢和子查詢中使用的COUNT和GROUP函數

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引入。

內部查詢並沒有真正引用外部查詢,因爲每個相關的子查詢,所以我不知道如何克服錯誤,儘管我最好的嘗試。有沒有人有什麼建議?

回答

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 
; 
+0

是這樣的作品,雖然百分比值出來有點過(!558%),但我可以解決這個問題我想關鍵是使用SUM而不是COUNT,然後。 ?非常感謝 – user2795273

+0

確實!我使用上述構造所有的時候,我必須根據各種條件來計數東西。如果這解決了你的問題,那麼你可以通過點擊勾號圖標來接受它作爲一個有效的答案。 – 2013-10-09 14:45:51