sql-小于100时过滤返回值

68de4m5k  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(305)

我有一个存储过程,它连接到其他表以计算一个百分比,我称之为column called mp.PrTotal 重命名为 TotalPercentage 我将用它来做图表。由于一些不好的数据 TotalPercentage 大于100%,应退回。
所以我尝试在它上面添加一个过滤器,类似于 SELECT ... WHERE TotalPercentage is less than or equal to 100 . 在尝试了几个不同的迭代之后。我仍然返回大于100的百分比。
最好的方法是什么?
我试图补充 WHERE mp.PrTotal <= 100 下面是我的返回结果示例:

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

我的预期结果是回报 TotalPercentage 不到100
例如:

+------------------------------------+
    | 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
brgchamk

brgchamk1#

您的尝试失败,因为您正在分组前进行筛选,而您要计算 sum() 首先,然后过滤。
你的问题似乎比需要的复杂得多。这几个级别的子查询没有意义。您可以选择、筛选、聚合、排序和限制,而无需任何嵌套。要对聚合结果进行筛选,可以使用 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 与原始查询中的相关(目前的情况是,这是一个语法错误)。查询只处理一个表,所以我只是取消了所有标识符的限定。

kpbpu008

kpbpu0082#

一种方法是使用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

相关问题