SQL - 过滤 return 小于 100 的值

SQL - Filtering return value when under 100

我有一个存储过程正在连接其他表以计算一个百分比,我将这个名为 mp.PrTotal 的列重命名为 TotalPercentage,我将用于图表。由于一些错误数据,TotalPercentage 中有一些大于 100% 的数据应该 returned。

所以我试图在其上添加一个过滤器,类似于 SELECT ... WHERE TotalPercentage is less than or equal to 100 的逻辑。在尝试了几次不同的迭代之后。我仍在 return回溯大于 100 的百分比。

解决这个问题的最佳方法是什么?

我尝试添加 WHERE mp.PrTotal <= 100

这是我的 return 结果的示例:

+------------------------------------+
| StateId ProductId   TotalPercentage|
+------------------------------------+
| 1             12           0.21    |
| 1             10         102.34    |
| 1            341          87.30    |
| 1             21          62.1     |
| 1             73         100.32    |
+------------------------------------+

我的预期结果是 return 小于 100TotalPercentage

例如:

    +------------------------------------+
    | StateId ProductId   TotalPercentage|
    +------------------------------------+
    | 1             12           0.21    |
    | 1            341          87.30    |
    | 1             21          62.1     |
    +------------------------------------+

这是我的存储过程:

select top 10
    StateId,
    ProductId,
    TotalPercentage,
from   
    (select        
         i.StateId,
         i.ProductId,
         sum(PrTotal) as TotalPercentage
     from          
         (select               
              mp.StateId,
              mp.ProductId,
              mpr.PrTotal,
          from
              dbo.MpTotals mp
          where         
              mp.StateId = @StateId
              and mp.ProductId = @ProductId
              and mp.PrTotal <= 100  -- filter attempt
        ) i
    group by             
        i.StateId, i.ProductId, ) 
order by 
    TotalPercentage desc

一种方法是使用 CTE 并从 CTE 中删除不需要的值

这只是一种方法

; with mycte as (

select top 10
                           StateId,
                           ProductId,
                           TotalPercentage,
              from   (

                           select        
                                                i.StateId,
                                                i.ProductId,
                                                sum(PrTotal) as TotalPercentage

                           from          (
                                                select               mp.StateId,
                                                                     mp.ProductId,
                                                                     mpr.PrTotal,
                                                                     
                                                from
                                                                     dbo.MpTotals mp

                                            
                                                where         mp.StateId= @StateId
                                                and           mp.ProductId= @ProductId
                                               
                                                              
                                                ) i
                          
                           group by             i.StateId,
                                                i.ProductId,

                           ) 

)

Select * from mycte 

where TotalPercentage <=100
              order by TotalPercentage desc

另一种方法是通过

向您的组添加一个 HAVING 子句

像这样

group by            
 i.StateId,
  i.ProductId,

having 

sum(PrTotal) <=100

您的尝试失败,因为您在分组前进行过滤,而您想先计算 sum(),然后再过滤。

您的查询似乎比实际需要的要复杂得多。这几级子查询没有意义。您可以 select、过滤、聚合、排序和限制,而无需任何嵌套。要过滤聚合结果,您可以使用 having 子句:

select top (10) StateId, ProductId, sum(PrTotal) TotalPercentage
from dbo.MpTotals
where StateId= @StateId and ProductId= @ProductId
group by StateId, ProductId
having sum(PrTotal) <= 100
order by TotalPercentage desc

不清楚别名 mpr 在您的原始查询中与什么相关(就目前而言,这是一个语法错误)。查询地址只有一个 table,所以我只是取消了所有标识符。