sqlserver向上递归统计

数据字典如下

只有,其中的‘xx‘表示‘from’,因为oschina不给输入关键字

kmcode,kmname,pidkm

101    ,税收收入, 0

10103   ,营业税,101

1010304,一般营业税,10103

10106, 个人所得税,101

1010601,个人所得税,10106

101060109,其他个人所得税,1010601

有一张表可以统计出

select * xx ps where swdjh=‘某值‘

结果如下

公司名称,科目代码,金额

aaaa, 101060109,20

那怎么向上推出他的父级科目代码的金额,

解决思路:

  1. 创建一张临时表来保存结果
  2. 用sqlserver cte 来查询出自己及父级所有的科目代码,代码如下
with cte as
 (  select a.kmcode,a.kmname,a.pidkm xx sys_km a   where kmcode in
 ( select t1.yskm  from view_dj  t1 where [email protected])
 union all
 select k.kmcode,k.kmname,k.pidkm  xx sys_km k inner join cte c on c.pidkm = k.kmcode  )

3.在通过cte和金额表关联把数据插入到临时表中代码如下

insert into #tmphjcx select * from ( select  distinct  a.kmcode,a.kmname,a.pidkm,
b.hjje,b.guoshui,b.dishui from cte a
   left join(
 select t2.kmcode,(t2.kmcode+‘_‘+t2.kmname) as kmname,hjje=sum(je),
guoshui=sum(case when t1.ic=‘1‘ then je end),dishui=sum(case when t1.ic=‘2‘ then je end)
xx view_dj  t1

left join sys_km  t2 on t2.kmcode=t1.yskm where [email protected]
group by t2.kmcode,t2.kmname)b
on b.kmcode=a.kmcode)c

4.这时查询临时表结果如下,可以看出科目代码顺序现在是对的,但是他们的金额都为空的,怎么根据下一级的科目金额获取上一级的科目金额呢

5,这时我们应该按科目代码的长度倒序排列,逐个更新金额,应该我们只有计算出上一级的金额,然后再上一级金额的基础上计算出下一级金额。(注意:逻辑思想很重要)

select kmcode,hjje xx #tmphjcx order by len(kmcode) desc

结果如下

6。这时我们再更新上面临时表中的记录(创建游标遍历金额表,和临时表关联来更新金额表的值)

update a  set a.hjje= b.hjje,a.guoshui=b.guoshui,a.dishui=b.dishui
	from #tmphjcx a
	left join(select sum(hjje) as hjje,sum(dishui) as dishui,
sum(guoshui) as guoshui,@kmcode as kmcode xx  #tmphjcx b where [email protected]  ) b
	on b.kmcode=a.kmcode where a.kmcod[email protected]

7.查询出我们想要的结果

select kmcode,(kmcode+‘_‘+kmname) as kmname,pidkm,isnull(hjje,0) as hjje,
isnull(guoshui,0) as guoshui,isnull(dishui,0) as dishui xx #tmphjcx

结果如下

最后:好的想法+技术可以解决一切难题。如要转载请保留原文地址。

时间: 2024-08-26 11:03:32

sqlserver向上递归统计的相关文章

sqlserver 树结构递归(向上递归和向下递归)

--获取当前及以下部门 Create proc GetCurrentAndUnderOrg @orgId int as begin WITH cte AS ( SELECT * ,0 AS level FROM Static_Organ WHERE [email protected] UNION ALL SELECT g.*,level+1 FROM Static_Organ g INNER JOIN cte ON g.ParentOrgan=cte.OrganID ) SELECT * FRO

3.sql中的向上递归和向下递归

1.向下递归 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with bmbm(本级关联条件)='610000000000'(本级编码)--包含本级 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with sjbmbm(本级关联条件)='6100000

[WinForm][DevExpress][TreeList]向上递归,获取公共父节点

最近项目开发中,需要获取到公共节点,如图: 譬如,当点击"Test103-2"节点,其类型是"灯"类型,那怎么获取到"中心区域"这个类型是"地域"的公共节点了?(不知道描述清楚木有哈) 核心代码: /// <summary> /// 向上递归,获取符合条件的父节点 /// </summary> /// <param name="node">需要向上递归的节点</pa

[WinForm][DevExpress][TreeList]向上递归,获取符合条件的父节点

关键代码: /// <summary> /// 向上递归,获取符合条件的父节点 /// </summary> /// <param name="node">需要向上递归的节点</param> /// <param name="conditionHanlder">判断条件[委托]</param> /// <returns>符合条件的节点[TreeListNode]</return

Oracle 向上递归、向下递归

---- 向上递归select distinct orgguid,dtb_orgguid,orgname from dtba_organization a start with orgguid = '2117bc0897e543168fd9702216165c77' connect by prior dtb_orgguid = orgguid orgguid 最小级别 ---- 向下递归 select distinct orgguid,dtb_orgguid,orgname from dtba_

Oracle 和 SQLSERVER 重新获取统计信息的方法

1. Oracle 重新获取统计信息的命令 exec dbms_stats.gather_schema_stats(ownname =>'LCoe739999',options => 'GATHER',estimate_percent => dbms_stats.auto_sample_size, method_opt => 'for all columns size repeat', degree => 4) # 需要修改 ownername options 指定 以及 d

SQLServer CTE递归和循环

Create table #country (AreaNam NVARCHAR(10),BelongTo Nvarchar(10),Msg varchar(100)) INSERT INTO #countrySELECT '中国','中国',null union allSELECT '江苏','中国',null union allSELECT '南京','江苏',null union allSELECT '无锡','江苏',null union allSELECT '徐州','江苏',null

linux shell 递归统计代码行数

一句话: find /path -name '*.cpp' |xargs wc -l

【java】递归统计本地磁盘所有文件,提取重复文件,JDK8 map迭代

package com.sxd.createDao; import java.io.File; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class Test { private long a = 0; Map<String, File> map = new HashMap<String, File>