SQL语句中SUM()OVER()的用法

    前两天改别人写的一个巨长的SQL,抽丝剥茧了半天,才找到需要修改的地方,但是看到了他用了一个比较少见(至少我没用过)的函数sum()over(),赶紧百度了下,真是孤陋寡闻了,看来基础还是要打打牢滴。

    简单来说,这是一个开窗函数,按照分组和排序进行逐行累加:

sum():里面放需要求和的字段

over():里面放分组的字段,和排序的字段

具体用法:

sum(求和字段)over(PARTITION by 分组字段1,分组字段2…… order by 排序字段1……)

 具体来说,那就举个例子吧,比如我们有一个表:

productyearIdmonthIdsaleNum
苹果2025110
苹果2025211
苹果2025312
香蕉2025120
香蕉2025221
香蕉2025322

使用下面的查询语句:

SELECT product,
        yearId,
        monthId,
        saleNum,
        sum(salesNum)over(PARTITION by product,yearId ORDER BY  monthId) saleSum
FROM table

就会得到如下结果:

productyearIdmonthIdsaleNumsaleSum
苹果202511010
苹果202521121
苹果202531233
香蕉202512020
香蕉202522141
香蕉202532263

也就是说,根据product和yearId进行分组,然后再按照monthId进行排序,最后将saleNum值依次按月累计求和。

这只是一种场景,其实还可以用在财务类的场景,比如有个期初值,其他行是每月的发生值,然后依次按月累计,就能得出每月的期末值等。

SQL Server 中的 `SUM` 语句是一种聚合函数,用于计算一列或多列的总和。它的高级应用包括但不限于以下几个方面: 1. **条件求和**:可以结合 `CASE` 或 `WHEN THEN ELSE` 子句,只对满足特定条件的行求和。例如,计算销售额大于某个值的产品的总销售额。 ```sql SELECT SUM(CASE WHEN Sales > 100 THEN Sales ELSE 0 END) AS TotalSales FROM SalesData; ``` 2. **分组求和**:配合 `GROUP BY` 可以按某列进行分类,然后分别计算每个组别的合计。例如,按月份统计每个月的订单总额。 ```sql SELECT MONTH(OrderDate), SUM(Quantity * Price) AS TotalAmount FROM Orders GROUP BY MONTH(OrderDate); ``` 3. **窗口函数**:SQL Server 2005及以上版本支持 `OVER()` 窗口函数,可以在每行数据的基础上进行累计求和、排名等操作。这在数据分析、报表生成中非常有用。 ```sql SELECT OrderID, SUM(Sales) OVER (ORDER BY OrderDate) AS RunningTotal FROM Orders; ``` 4. **联合查询**:可以跨多个表进行求和,前提是它们之间存在关联。比如合并两个表的字段值并求和。 ```sql SELECT SUM(T1.Value + T2.Value) AS TotalSum FROM Table1 T1 JOIN Table2 T2 ON T1.Key = T2.Key; ``` 5. **动态SQL**:如果需要根据用户输入或其他变量动态生成 SQL 查询,再使用 `SUM`,则需额外小心防止 SQL 注入风险。 以上都是 `SUM` 语句SQL Server 中的一些高级应用。记住在使用时始终要考虑效率和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值