2015-06-19 76 views
0

我想迭代一個計算,該計算需要符合特定標準的人數,並根據不同地區的計數來計算百分比。是否可以在列中的不同值上迭代計算?

我的代碼:

USE Database1; 
GO 


declare @ShouldRegister as float 
declare @Registered as float 


SET @ShouldRegister = (SELECT COUNT(*) FROM dbo.TABLE 
       WHERE field1 in.. 
       AND field2 in.. 
       AND field3 in.. 
       ... 
       ) 

SET @Registered = (SELECT COUNT(*) FROM dbo.TABLE 
       WHERE field1 in.. 
       AND field2 in.. 
       AND field3 in.. 
       ... 
       ) 

SELECT 
    @ShouldRegister as ShouldRegister 
    , @Registered as Registered 
    , cast((@Registered/NULLIF(@ShouldRegister, 0))*100 as decimal(12,8)) as Percentmet 
    , CAST(100*2.33*(SQRT(@Registered/NULLIF(@ShouldRegister, 0) * (1-(@Registered/NULLIF(@ShouldRegister, 0)))/NULLIF(@ShouldRegister, 0))) as decimal(12,8)) + cast((@Registered/NULLIF(@ShouldRegister, 0))*100 as decimal(12,8)) as AdjPercentmet 

代碼返回是這樣的:

ShouldRegister Registered Percentmet  adjpercentmet 
223587   565   0.25269805  0.27743717 

每個人都有在 「區域」 列分配到的區域。上面的代碼可以計算所有地區。我想看到的是:

ShouldRegister Registered Percentmet  adjpercentmet Region 
223    50   0.12345678  0.12345678  Region1 
456    100   0.12345678  0.12345678  Region2 
789    456   0.12345678  0.12345678  Region3 

我的腦袋要做到:「對於區域的區域,做(代碼)」,但我不認爲SQL這樣工作。

+1

你必須是你使用的變量,然後你只能有一個價值的問題。由於你的計算看起來很複雜,你應該考慮使用交叉應用在選擇中重複使用相同的計算 –

+0

請添加一個示例數據,我認爲你可以爲該輸出使用一個select語句;)。 –

回答

1

試試這個方法: -

Set Nocount On; 

Select t.ShouldRegistered 
     ,t.Registered 
     ,t.Region 
     ----- Isnull(,0) will cause of divide by zero error if null 
     ,Cast((t.Registered/(Case When Isnull(t.ShouldRegistered,0) = 0 Then 1 Else t.ShouldRegistered) * 100) As Decimal(12,8)) As Percentmet 
     ,[AdjPercentmet condition] As AdjPercentmet 
From (
      Select tb.Region 
        ,Sum(Case When [tb.Field1.....Condition] And [tb.Field2.....Condition] And [tb.Field3....Condition] Then 1 Else 0 End) As ShouldRegistered 
        ,Sum(Case When [tb.Field1.....Condition] And [tb.Field2.....Condition] And [tb.Field3....Condition] Then 1 Else 0 End) As Registered 
      From dbo.TABLE As tb With (Nolock) 
      Group By tb.Region 
     ) As t 
Group By t.ShouldRegistered 
     ,t.Registered 
     ,t.Region 
Order By t.Region 
+0

這只是稍作修改而已。我相信SUM只返回一個整數。我不得不將SUM線更改爲Cast(sum ....)作爲float ...感謝您的幫助,我非常感謝它。 – userPinealbody

+0

你是對的,Sum將返回Int,但我已經以不同的方式應用Sum來計算你正在計數的內容並進一步計算Percentmet和Adjpercentmet中的外部查詢。 –

相關問題