简体   繁体   English

WHERE子句中列的SQL SUM

[英]SQL SUM of a Column in WHERE Clause

I got a large table like below : 我有一张大桌子,如下所示:

--------------------------
OrderNo     OrderQuantity
--------------------------
100             250.00
101             455.10
102              89.55
103             112.15
104             330.12

I have to filter by SUM of OrderQuantity by less than or equal to 800.00. 我必须按OrderQuantity的SUM筛选小于或等于800.00。 My SQL query is below which did not work as expected. 我的SQL查询如下,但未按预期工作。

SELECT OrderNo, OrderQuantity
    FROM WorkOrder
        HAVING SUM(OrderQuantity) <= 800

I expect a result like below. 我希望得到如下结果。

--------------------------
OrderNo     OrderQuantity
--------------------------
100             250.00
101             455.10
102              89.55

Can anybody help me please? 有人可以帮我吗?

;With cte(OrderNo,OrderQuantity)
AS
(
SELECT 100,250.00 Union all
SELECT 101,455.10 Union all
SELECT 102, 89.55 Union all
SELECT 103,112.15 Union all
SELECT 104,330.12 
)
SELECT OrderNo,OrderQuantity From
(
SELECT *,SUM(OrderQuantity) Over( Order by OrderNo) AS SumOrderQuantity from cte
)Dt
Where Dt.SumOrderQuantity <=800

OutPut 输出

--------------------------
OrderNo     OrderQuantity
--------------------------
100             250.00
101             455.10
102              89.55

Use this. 用这个。 Although your sample has only 1 orderno per orderquantity , if you have multiple orderno , and you want to get the sum , use the below query. 虽然你的样品只有1 ordernoorderquantity ,如果你有多个orderno ,你想要得到的sum ,使用下面的查询。

SELECT OrderNo, sum(OrderQuantity)
    FROM WorkOrder
GROUP BY OrderNo
HAVING SUM(OrderQuantity) <= 800

So if you want to perform any aggregated calculations on a set of rows, you need GROUP BY 因此,如果要对一组行执行任何aggregated计算,则需要GROUP BY

One approach is to use a correlated subquery to find the cumulative sum of the order quantity, and then restrict to only records where that sum is less than or equal to 800. 一种方法是使用相关子查询来查找订单数量的累积总和,然后仅限制该总和小于或等于800的记录。

SELECT
    t1.OrderNo,
    t1.OrderQuantity,
    (SELECT SUM(t2.OrderQuantity) FROM WorkOrder t2
     WHERE t2.OrderNo <= t1.OrderNo) AS CumOrderQuantity
FROM WorkOrder t1
WHERE t1.CumOrderQuantity <= 800

你以错误的方式,坏语法,这样当你使用HAVING子句, 应该要在having子句,像这样使用列SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value ,尝试这样,您可以解决此问题

if you are using sql sever 2012 or later you could do the following 如果您使用的是sql sever 2012或更高版本,则可以执行以下操作

SELECT OrderNo, OrderQuantity
FROM WorkOrder
Group By OrderNo, OrderQuantity
Having SUM(OrderQuantity) OVER (ORDER BY OrderNo) < 800

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM