SQL的计算列能否引用该列的上一行的计算结果参与当前行的计算?

weixin_44110690 2019-01-30 01:47:52
计算移动加权平均价是(上期成本+本期成本)/(上期结存+本期结存)

现在数据表有 本期入库数量、本期入库金额、本期数量结存

而移动加权平均单价这一列是根据公式计算出来的计算列。

请问计算列能否引用该列的上一行的计算结果参与当前行的计算?

第一行计算出移动加权平均单价,把该结果*第一行的本期数量结存,参与到下一行的移动加权平均单价的计算中去?

(不用存储过程,之前就是存储过程实现的,维护太麻烦)
...全文
338 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shoppo0505 2019-01-31
  • 打赏
  • 举报
回复
#T是临时表。
declare 是声名表变量的。
表变量的声名方式是
declare @t table ...
weixin_44110690 2019-01-30
  • 打赏
  • 举报
回复
引用 2 楼 shoppo0505 的回复:
可以,用CTE写。
如果不会,就多分几步,用临时表解决。

if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T(日期 date,ID int,WL01_01_GUID Nvarchar(50),单价 numeric(28,2),数量 numeric(28,2),累计数量 numeric(28,2),加权平均单价 numeric(28,2))
Insert into #T Select ****
Go

with cte as (
SELECT * FROM #T WHERE id = 1
UNION ALL
select a.日期,a.ID,a.WL01_01_GUID,a.单价,a.数量,
CAST((a.数量 + b.累计数量) as numeric(28,2)) as 累计数量
,
(case
when isnull(a.单价,0) = 0 then cast(b.加权平均单价 AS numeric(28,2))
else cast((b.加权平均单价*b.累计数量+ a.单价*a.数量)/(b.累计数量+a.数量) as numeric(28,2)) end
) as 加权平均单价
FROM #T a
JOIN cte b ON a.ID = b.ID + 1)

SELECT * FROM cte

创建一张表可以实现,现在想把#T变成临时表,用declare 声明#T,提示必须声明表变量 "#T"
请问怎么解决?

shoppo0505 2019-01-30
  • 打赏
  • 举报
回复
可以,用CTE写。
如果不会,就多分几步,用临时表解决。
Hello World, 2019-01-30
  • 打赏
  • 举报
回复
新版本的SQL有LGA和LEAD函数,试下看看能不能满足?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧