2015-06-19 73 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中的外部查询。 –

相关问题