问题描述
这是我的桌子:
cust_id | order_id | 订单日期 | total_value | 运行总数 | mytotal |
---|---|---|---|---|---|
1 | 2 | 7/20/2021 | 100 | 100 | 300 |
1 | 3 | 7/21/2021 | 200 | 300 | 300 |
我的问题:我正在尝试计算运行总数:
mytotal = sum(total_value)(order by order_date)
running total = sum(total_value)(order by order_id)
为什么 mytotal
返回的是常量值而不是与 runningtotal
相同的值?造成这种差异的原因是什么?
解决方法
你一定是做错了什么。请看以下内容:
declare @test table (
cust_id int,order_id int,order_date date,total_value int
);
INSERT INTO @test VALUES
(1,2,'2021-07-20',100),(1,3,'2021-07-21',200);
SELECT cust_id,order_id,order_date,total_value,SUM(total_value) OVER (order by order_date) as mytotal,SUM(total_value) OVER (order by order_id) as running_total
FROM @test;
输出:
cust_id | order_id | 订单日期 | total_value | 我的全部 | running_total |
---|---|---|---|---|---|
1 | 2 | 2021-07-20 | 100 | 100 | 100 |
1 | 3 | 2021-07-21 | 200 | 300 | 300 |
如您所见,mytotal 和 running_total 是相同的。
为了进一步帮助您,请向我们展示您在做什么。为此,请像我为您所做的那样提供表创建和插入数据语句,以及您正在使用的确切代码,或者至少是复制您的问题的简化版本。请注意,代码中的表达式缺少 OVER
。
您需要添加 ROWS UNBOUNDED PRECEDING
。
默认窗口是 RANGE UNBOUNDED PRECEDING
,如果有两行具有相同的顺序(在本例中为相同的 id
),它会给出错误的结果:
mytotal = sum(total_value) over (order by order_date rows unbounded preceding)
running total = sum(total_value) over (order by order_id rows unbounded preceding)
,
将 OVER 子句与 SUM 一起使用,如下所示。
SELECT
cust_id,SUM (total_value) OVER (ORDER BY cust_id) AS runningTotal,FROM orders