本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。
10 个评论
Sum Over这个第一见。
学了一招
NB啊 这招 sum over
赞,先mark,哈哈
2008R2下的开窗函数不支持order by,应该是从2012开始支持的。
关键点:Sum开窗函数如果有Order by是组内从第一行到当前行,没有order by则是组内所有数据求和。由于没有Partition by,因此所有数据为一个组。
关键点:Sum开窗函数如果有Order by是组内从第一行到当前行,没有order by则是组内所有数据求和。由于没有Partition by,因此所有数据为一个组。
用Cross Apply也可以实现
--2008R2下的开窗函数不支持order by。
WITH tmp AS (
SELECT 1 AS '条码', 950 '销售金额'
UNION ALL
SELECT 2 , 698
UNION ALL
SELECT 3, 610
UNION ALL
SELECT 4 , 375
UNION ALL
SELECT 5 , 351
UNION ALL SELECT 6 , 142
)
select a.*,ab.lj,ab.lj*1.0/(ac.zj) from tmp a
cross apply (select lj= SUM(销售金额) from tmp b where b.条码<=a.条码) ab
cross apply (select zj= SUM(销售金额) from tmp b) ac
与“旧方案:子查询”类似,但看了执行计划,效率应该要高些。
请各路大侠指教。
--2008R2下的开窗函数不支持order by。
WITH tmp AS (
SELECT 1 AS '条码', 950 '销售金额'
UNION ALL
SELECT 2 , 698
UNION ALL
SELECT 3, 610
UNION ALL
SELECT 4 , 375
UNION ALL
SELECT 5 , 351
UNION ALL SELECT 6 , 142
)
select a.*,ab.lj,ab.lj*1.0/(ac.zj) from tmp a
cross apply (select lj= SUM(销售金额) from tmp b where b.条码<=a.条码) ab
cross apply (select zj= SUM(销售金额) from tmp b) ac
与“旧方案:子查询”类似,但看了执行计划,效率应该要高些。
请各路大侠指教。
可惜2005用不了
SELECT 条码,
销售金额,
SUM(销售金额) OVER(ORDER BY 条码 rows unbounded preceding) AS 累计金额,
SUM(销售金额) OVER(ORDER BY 条码 rows unbounded preceding) * 1.0
/ ( SUM(销售金额) OVER ( ) ) AS 累计权重
FROM tmp
这样也可以
销售金额,
SUM(销售金额) OVER(ORDER BY 条码 rows unbounded preceding) AS 累计金额,
SUM(销售金额) OVER(ORDER BY 条码 rows unbounded preceding) * 1.0
/ ( SUM(销售金额) OVER ( ) ) AS 累计权重
FROM tmp
这样也可以