SQL server sum() over 累加注意问题

sum over全部累加和逐行累加的用法:
在这里插入图片描述

SELECT FROM (

SELECT *,20000 as ReQTY,'发料方式' as SendReelStyle,SUM(ReelQty)

OVER (ORDER BY ReelQty DESC rows BETWEEN unbounded preceding and current row) AS sumReelQtyAsc 

SUM(ReelQty) OVER() AS sumReelQty

FROM [LightLampSystemDB].[dbo].[SaveTable] WHERE ReelQty!=0 AND ReelPartNo='0341222332') AS t 
WHERE sumReelQtyAsc<=20000

ORDER BY ReelQty;

SQL SERVER:开窗函数 SUM() OVER() 数据统计中一例使用

在这里插入图片描述
前几天,有个朋友刚好问到本人有关 SQL 语句,大致是原表有两列,分别为月份、月份销售额,而需要一条 SQL 语句实现统计出每个月份以及当前月以前月份销售额和。尼玛,感觉还是没有说清,下面用图表示。
在这里插入图片描述
SQL 测试表脚本

DECLARE @Temp Table
(
  ID INT, --- 月份
  MoneyData Float  --- 金额 
)

insert  INTO @TEMP
SELECT 1,100 UNION ALL
SELECT  2,200 UNION ALL
SELECT  3,300 UNION ALL
SELECT  4,400 UNION ALL
SELECT  5,500 UNION ALL
SELECT  6,600 UNION ALL
SELECT  7,600

一 自连接

SELECT  A.ID, SUM(B.MoneyData)  FROM @Temp A INNER JOIN @Temp B
ON A.ID>=B.ID GROUP BY A.ID

------ 重点在于 ON 条件,通过自连接 A.ID >= B.ID ,可获取所需数据,再通过GROUP BY 、SUM 即可统计求和

二 开窗函数

SELECT  ID, MoneyData,   SUM(MoneyData) OVER( ) AS '总销售额',
SUM(MoneyData) OVER( PARTITION BY ID ) AS '月销售额',
SUM(MoneyData) OVER( ORDER BY ID ASC)  AS '当月+当月前销售额'
FROM @Temp

---- 此处,使用开窗函数使用更为简单,不过,其中 SUM() OVER ( ORDER BY ID ASC ) 即可实现以上功能

在这里插入图片描述
关于,开窗函数的具体用法,可参考微软 MSDN 官方 API 文档,最后,推荐一本开窗函数书:基于 SQL SERVER 2012 窗口函数。


sql开窗函数_累计求和开窗函数sum() over()

需求:有如下示例数据,其中PRODUCT表示产品,CONTRACT_MOUTH表示合同月份,AMOUNT表示当月合同金额,请求出每个产品累计合同金额。

比如牛奶2月份累计求和金额为100+200=300,牛奶3月份累计求和金额为100+200+300=600,依此类推。
在这里插入图片描述
示例数据sql:

CREATE TABLE SUMOVER(
PRODUCT VARCHAR(50),
CONTRACT_MOUTH INT,
AMOUNT DECIMAL(18,2)
)

INSERT INTO SUMOVER VALUES ('牛奶','1','100')
INSERT INTO SUMOVER VALUES ('牛奶','2','200')
INSERT INTO SUMOVER VALUES ('牛奶','3','300')
INSERT INTO SUMOVER VALUES ('牛奶','4','400')
INSERT INTO SUMOVER VALUES ('牛奶','5','500')
INSERT INTO SUMOVER VALUES ('牛奶','6','600')
INSERT INTO SUMOVER VALUES ('牛奶','7','700')
INSERT INTO SUMOVER VALUES ('牛奶','8','800')
INSERT INTO SUMOVER VALUES ('牛奶','9','900')
INSERT INTO SUMOVER VALUES ('牛奶','10','1000')
INSERT INTO SUMOVER VALUES ('牛奶','11','1100')
INSERT INTO SUMOVER VALUES ('牛奶','12','1200')
INSERT INTO SUMOVER VALUES ('酱油','1','100')
INSERT INTO SUMOVER VALUES ('酱油','2','200')
INSERT INTO SUMOVER VALUES ('酱油','3','300')
INSERT INTO SUMOVER VALUES ('酱油','4','400')
INSERT INTO SUMOVER VALUES ('酱油','5','500')
INSERT INTO SUMOVER VALUES ('酱油','6','600')
INSERT INTO SUMOVER VALUES ('酱油','7','700')
INSERT INTO SUMOVER VALUES ('酱油','8','800')
INSERT INTO SUMOVER VALUES ('酱油','9','900')
INSERT INTO SUMOVER VALUES ('酱油','10','1000')
INSERT INTO SUMOVER VALUES ('酱油','11','1100')
INSERT INTO SUMOVER VALUES ('酱油','12','1200')

查询sql如下:

SELECT *,SUM(AMOUNT)OVER(PARTITION BY PRODUCT ORDER BY CONTRACT_MOUTH) AS SUM_AMOUNT
FROM SUMOVER

查询结果如下:
在这里插入图片描述

### SQL ServerSUM 函数的使用方法 #### 1. 基本定义与功能 SQL Server 的 `SUM()` 是一种聚合函数,用于计算指定列中数值型数据的总和。该函数仅适用于数字类型的字段,并忽略 NULL 值[^1]。 #### 2. 基础语法 以下是 `SUM()` 函数的基础语法: ```sql SELECT SUM(column_name) AS total_sum FROM table_name; ``` 其中: - `column_name` 是要进行求和运算的目标列; - `table_name` 是目标表名称。 #### 3. 示例说明 假设有一个名为 `Sales` 的表格,结构如下: | SaleID | ProductName | Quantity | |--------|-------------|----------| | 1 | Apple | 10 | | 2 | Banana | 20 | | 3 | Orange | 30 | 如果需要计算所有商品的数量总和,则可以运行以下查询: ```sql SELECT SUM(Quantity) AS TotalQuantity FROM Sales; ``` 此查询的结果将是 `TotalQuantity = 60`。 #### 4. 结合条件过滤 可以通过 `WHERE` 子句限定范围内的求和操作。例如,只对数量大于等于 20 的商品进行求和: ```sql SELECT SUM(Quantity) AS FilteredSum FROM Sales WHERE Quantity >= 20; ``` 在此情况下,结果为 `FilteredSum = 50` (即 20 + 30)。 #### 5. 处理负数的情况 当目标列包含负数时,可以直接应用 `SUM()` 进行累加。然而,在某些场景下(如分页统计),可能需要借助子查询实现精确控制。例如: ```sql SELECT SUM(o.Quantity) AS SubquerySum FROM ( SELECT Quantity FROM Sales ORDER BY SaleID DESC LIMIT 2 -- MySQL/Limit 示例;对于 SQL Server 应替换为 TOP 或 OFFSET/FETCH ) AS o; ``` 上述例子展示了如何利用子查询选取特定部分的数据并对其进行汇总[^2]。 #### 6. 窗口函数中的应用 在更高级的应用场合,可以结合窗口函数完成更为灵活的操作。比如按类别分别累计销售量的同时保留原始记录: ```sql SELECT Category, ProductName, Quantity, SUM(Quantity) OVER(PARTITION BY Category) AS CategoryTotal FROM Sales; ``` 这段代码会生成每条记录对应的分类总计信息而无需额外分组[^3]。 --- ### 注意事项 尽管 `SUM()` 功能强大,但在实际开发过程中需注意其适用性和潜在陷阱。例如,确保参与运算的字段确实为数值类型以免引发错误或异常行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值