SQLServer树型求和

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- this document design by zzl --
-- function : total about a tree structure
-- author : Lori.zhang ,zzl
-- display view : a1   3
--                a11  2
--                a111 1
------------------------------------------
ALTER  proc [dbo].[zzl_task_tree_total] --通过指定的taskid,来获取它和它下面的所有子元素的汇总和
  @taskid int
as 
declare @level_tt table(taskid nvarchar(1000),parentID nvarchar(1000),level int) --声明一个表变更,ID,上级ID,及层次
  declare @level int
  set @level=0
  insert @level_tt(taskid,parentID,level) --插入到表变量@level_tt,将所有上级ID为null或是为0的记录
  select taskid,parentID,@level from task where isnull (parentID,'')=''  
  while @@ROWCOUNT>0 --当存在这样的记录时
  begin 
          set @level=@level+1 --层次变更自加1
          insert @level_tt(taskid,parentID,level) --插入到表变更@level_tt,将所有的task表的上级ID等于@level_tt表的ID并且是它的低一级的记录
          select a.taskid,cast(b.parentID as varchar)+cast(a.taskid as varchar),@level
            from task a,@level_tt b
            where a.parentID=b.taskid and b.level=@level-1
 end
 select * from @level_tt  --显示级联的结构
-- 上面程序执行的结果为:
-- taskid  parentid  level 
-- 1   0    0
-- 2   01    1
-- 3   01    1
-- 4         012         2
-- 从上面的结果可以看到,表中的1,2,4有着关系,他们是树型结果的,如果想求1的结果,需要将2和4的结果相加
declare @tmp table(taskid int,parentid int,total float,moneyTotal float) --再定义表变更@tmp
insert into @tmp --插入到@tmp表,从task表,@level_tt表,求和对象为realmoney,当realmoney为空时,把它设为0,求和条件为
select a.taskid,a.parentID,SUM(isnull(c.realwork,0)) as total,SUM(isnull(c.realmoney,0)) as moneytotal --parentid为parentid%,使用通配符
  from task a,@level_tt b,Task c,@level_tt d
  where (a.taskid=b.taskid and 
c.taskid=d.taskid
        and d.parentID like b.parentID+'%' ) 
 and (a.taskid=@taskid)
  group by a.taskid,a.parentID
  order by a.parentID

--select @total=total from @tmp 
if @@rowcount=0  --如果没有找到记录,就向临时表插入空记录
begin
     insert into @tmp(taskid,parentid,total,moneytotal)values(0,0,0,0) --如果没有记录,就插入一个0记录
end
select total,moneytotal from @tmp --选择临时表

本文转自博客园张占岭(仓储大叔)的博客,原文链接:SQLServer树型求和如需转载请自行联系原博主。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
27天前
|
SQL Java 数据库连接
com.microsoft.sqlserver.jdbc.SQLServerException: 索引 7 超出范围。
com.microsoft.sqlserver.jdbc.SQLServerException: 索引 7 超出范围。
9 0
|
6月前
SQLServer 模糊递归查询
SQLServer 模糊递归查询
20 0
|
6月前
|
SQL 索引
com.microsoft.sqlserver.SQLServerException:索引1超出范围
com.microsoft.sqlserver.SQLServerException:索引1超出范围
41 0
|
12月前
|
索引
SqlServer 事物与索引
SqlServer 事物与索引
49 0
|
SQL Java 数据库连接
com.microsoft.sqlserver.jdbc.SQLServerException: 索引 7 超出范围
com.microsoft.sqlserver.jdbc.SQLServerException: 索引 7 超出范围。
141 1
|
SQL 索引 Windows
索引超出了数组界限(Microsoft.SqlServer.Smo)
SSMS连接远程SQL Server服务器是很方便的。 昨天我用SQL Server 2008 SSMS连接SQL Server 2012竟然报错,如下图: 在网上搜了,参考这个参考那个,太啰嗦了,确实是软件固有的问题,微软肯定会发补丁解决的! 于是看了我的SQL Server 2008的版本,在SSMS界面,帮助--关于。
3569 0