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,所以我只是取消了所有标识符。
我有一个存储过程正在连接其他表以计算一个百分比,我将这个名为 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,所以我只是取消了所有标识符。