用ROW_number实现组内逐行累加出现的问题
我现在要按项目统计每年每月各个会计科目的借贷情况。
图中贷方(credit)之前的列都是表中的列,u_docnum是会计凭证编号。其他都是派生列。黄色框内是通过row_number函数获得列,debitsum是debit逐行累加的结果,同理creditsum是credit逐行累加结果。
代码如下:
----------------------------
/*项目明细账代码*/ -- 增加docnum
with xmmxz (year,month,prjname,account,acctname,debit,credit,Row_Num,u_docnum)
as
(
select year(t0.refdate) as 'year',month(t0.refdate) as 'Month',
t3.prjname,t1.account,t2.acctname,t1.debit,t1.credit,
row_number()over(partition by t3.prjname,t1.account,t2.acctname,year(t0.refdate),month(t0.refdate)
order by t0.u_docnum) as Row_Num --获得序号
,t0.u_docnum from ojdt t0 inner join jdt1 t1 on t1.transid=t0.transid
inner join oact t2 on t2.acctcode=t1.account
left join oprj t3 on t3.prjcode=t1.project
where t3.prjname is not null and t3.prjname<>'other' --测试使用,实际应用时and t3.prjname<>'other'不加
)
select *,(case
when debitsum-creditsum > 0 then '借'
when debitsum-creditsum = 0 then '平'
else '贷'
end) as '方向'
from
(select t2.year,t2.month,prjname,account,acctname,cast(debit as numeric(10,3)) as debit
,cast(credit as numeric(10,3)) as credit,Row_Num,u_docnum
,(select cast(sum(debit) as numeric(10,3))
from xmmxz t1
where t1.Row_Num<=t2.Row_Num and t1.year=t2.year and t1.month=t2.month and t1.prjname=t2.prjname
and t1.account=t2.account and t1.acctname=t2.acctname) as debitsum --通过自连接(序号)实现累加
,(select cast(sum(t1.credit) as numeric(10,3))
from xmmxz t1
where t1.Row_Num<=t2.Row_Num and t1.year=t2.year and t1.month=t2.month and t1.prjname=t2.prjname
and t1.account=t2.account and t1.acctname=t2.acctname) as creditsum
from xmmxz as t2) as ttt
---------------------------
产生结果如图,但是图中红色框内不是逐行累加,(红色框位置有点不对,各位应该看得懂的),而绿色框内就是逐行累加的。不知道为什么。

图中贷方(credit)之前的列都是表中的列,u_docnum是会计凭证编号。其他都是派生列。黄色框内是通过row_number函数获得列,debitsum是debit逐行累加的结果,同理creditsum是credit逐行累加结果。
代码如下:
----------------------------
/*项目明细账代码*/ -- 增加docnum
with xmmxz (year,month,prjname,account,acctname,debit,credit,Row_Num,u_docnum)
as
(
select year(t0.refdate) as 'year',month(t0.refdate) as 'Month',
t3.prjname,t1.account,t2.acctname,t1.debit,t1.credit,
row_number()over(partition by t3.prjname,t1.account,t2.acctname,year(t0.refdate),month(t0.refdate)
order by t0.u_docnum) as Row_Num --获得序号
,t0.u_docnum from ojdt t0 inner join jdt1 t1 on t1.transid=t0.transid
inner join oact t2 on t2.acctcode=t1.account
left join oprj t3 on t3.prjcode=t1.project
where t3.prjname is not null and t3.prjname<>'other' --测试使用,实际应用时and t3.prjname<>'other'不加
)
select *,(case
when debitsum-creditsum > 0 then '借'
when debitsum-creditsum = 0 then '平'
else '贷'
end) as '方向'
from
(select t2.year,t2.month,prjname,account,acctname,cast(debit as numeric(10,3)) as debit
,cast(credit as numeric(10,3)) as credit,Row_Num,u_docnum
,(select cast(sum(debit) as numeric(10,3))
from xmmxz t1
where t1.Row_Num<=t2.Row_Num and t1.year=t2.year and t1.month=t2.month and t1.prjname=t2.prjname
and t1.account=t2.account and t1.acctname=t2.acctname) as debitsum --通过自连接(序号)实现累加
,(select cast(sum(t1.credit) as numeric(10,3))
from xmmxz t1
where t1.Row_Num<=t2.Row_Num and t1.year=t2.year and t1.month=t2.month and t1.prjname=t2.prjname
and t1.account=t2.account and t1.acctname=t2.acctname) as creditsum
from xmmxz as t2) as ttt
---------------------------
产生结果如图,但是图中红色框内不是逐行累加,(红色框位置有点不对,各位应该看得懂的),而绿色框内就是逐行累加的。不知道为什么。
...全文
相关推荐
SQL Server中row_number函数的常见用法示例详解
"本文主要介绍了SQL Server中row_number()函数的使用方法,包括其基本概念、语法结构以及一些具体的使用示例。ROW_NUMBER()函数是一个窗口函数,它为结果集的每一行分配一个唯
ROW_NUMBER()函数
ROW_NUMBER() 函数的实现机制---------------------------ROW_NUMBER() 函数的实现机制是使用索引来提高查询效率。
row_number,根据多个字段过滤,partition by
#### 2.3 SQL查询语句示例具体到本案例中,可以使用如下SQL语句来实现需求:```sqlSELECT *FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION
SQLServer中Partition By及row_number 函数使用详解
此时,可以使用 `PARTITION BY` 结合 `ROW_NUMBER()` 来实现这个需求。
oracle中rownum和row_number()
"Oracle数据库中的rownum和row_number()是两个不同的行编号机制,它们在处理数据时有着各自的特点和用途。rownum是Oracle数据库的一个内置伪列,它为查询结果集中的每一行分


疑难问题
