迭代求和问题,给多个树结构子节点的数据组合父项求和。(盼高人进!)
组织表科目表
组织组织PIDlev科目科目PIDlev
A 1K 1
B1 A 2K1 K2
B2A2K2K2
C11B13K11K13
C12B13K12K13
C13B13K13K13
C21B23K21K23
C22B23K22K23
C23B23K23K23
项目表其他项表
项目 项目PIDlev其他项 其他项PIDlev
X 1Q 1
X1 X2Q1 Q2
X2X2Q2Q2
X11X13Q11Q13
X12X13Q12Q13
X13X13Q13Q13
X21X23Q21Q23
X22X23Q22Q23
X23X23Q23Q23
数据表(由上面各基础表的末级节点组合而成,没有父项数据)
组织科目项目其他项预算数据实际数据年月份
C11K11Q114599 479020125
C11K12Q224466 465920126
C11K13Q134623 237320125
C11K212747 233120126
C11K22X124993 308020126
C11K23X132327 214120125
C12K124161 259220125
C13K13X132101 264620125
C21K13X132910 368520125
C22K21X113674 460820126
C23K12Q124404 358220125
C13K13Q133867 401320125
C21K13Q214927 239620125
C22K21Q222764 396520126
C23K12X123129 464820125
C13K13X133660 295620126
需求:根据数据表中各子节点的值表,根据递归原则,用Sql查询出各父项的和值,父项等于其子节点之和。由于涉及4个字段都为树结构,需考虑任意组合的父项数据计算。
查询字段:科目,预算数据,实际数据,可用额度,预算执行率,其中“可用额度”=预算数据-实际数据;“预算执行率”=实际数据/预算数据
查询条件:科目、组织、项目、其他项、年份、月份
有数据的查询条件组合:
1、科目、组织不为空,项目和其他项为空
2、科目、组织、项目不为空,其他项为空
3、科目、组织、其他项不为空,项目为空
要求:1、当查询条件科目选择后,需要查询出该科目的本身和所有后代对应的预算数据、实际数据等等,并以科目分组,查询各科目的和值等等
2、各字节点值表随业务实时变化,要求根据查询条件实时查询出查询字段的最新值,用一条SQL 或 存储过程写出
对于我来说难度很大,请各位高人,看看。谢谢了。
[解决办法]
- SQL code
-- 查询指定部门下面的所有部门, 并汇总各部门的下级部门数DECLARE @Dept_name nvarchar(20)SET @Dept_name = N'MIS';WITHDEPTS AS( -- 查询指定部门及其下的所有子部门 -- 定位点成员 SELECT * FROM Dept WHERE name = @Dept_name UNION ALL -- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归 SELECT A.* FROM Dept A, DEPTS B WHERE A.parent_id = B.id),DEPTCHILD AS( -- 引用第1个CTE,查询其每条记录对应的部门下的所有子部门 SELECT Dept_id = P.id, C.id, C.parent_id FROM DEPTS P, Dept C WHERE P.id = C.parent_id UNION ALL SELECT P.Dept_id, C.id, C.parent_id FROM DEPTCHILD P, Dept C WHERE P.id = C.parent_id),DEPTCHILDCNT AS( -- 引用第2个CTE, 汇总得到各部门下的子部门数 SELECT Dept_id, Cnt = COUNT(*) FROM DEPTCHILD GROUP BY Dept_id)SELECT -- JOIN第1,3个CTE,得到最终的查询结果 D.*, ChildDeptCount = ISNULL(DS.Cnt, 0)FROM DEPTS D LEFT JOIN DEPTCHILDCNT DS ON D.id = DS.Dept_idGO-- 删除演示环境DROP TABLE Dept本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fredrickhu/archive/2009/09/19/4569529.aspx