还是SQL疑难计算. 还是搞不定.

ykwang 2008-09-17 01:45:20
表的目的是建立如下的管理目的:
X
t1 t2
a1 a2 a3 a4
b1 b2 b3 b4 b5 b6 b7 b8
意思是:X为最高点, T1 与T2属于 X,分属左边与右边
A1与A2属于 T1的分支, A3 与A4属于 T2的分支
B1与B2属于 A1的分支, B3与B4属于 A2的分支
B5与B6属于A3的分支, B7与B8属于A4的分支.

为表述如上结构, 我建立的表结果如下:

userid (自增字段)
userbagid (保存父节的ID)
usertype (保存是左边,还是右边)
amount (保存金额)
name (保存姓名)
现在 数据如下:
userid userbagid usertype amount name
1 001 0 0 x
2 1 left 1000 t1
3 1 right 800 t2
4 2 left 800 a1
5 2 right 700 a2
6 3 left 800 a3
7 3 right 800 a4
8 4 left 700 b1
9 4 right 700 b2
10 5 left 600 b3
11 5 right 500 b4
12 6 left 700 b5
13 6 right 700 b6
14 7 left 600 b7
15 7 right 500 b8


userbagid =001 代表是顶点
要实现的目的是: 将第一层至倒数第二层的数据计算出来 保存到temp 表中 内容为
userid (id字段)
name (name字段)
leftamount(左合计金额)
rightamout (右合计金额)
计算要求为: 如X 的值. T1 与 T2 分属 X 的左,右合计值,如X的左合计值为T1+A1+A2+B1+B2+B3+B4
右合计值为T2+A3+A4+B5+B6+B7+B8
T1的值, A1与A2分属T1的左与右, T1的左合计值为:A1+B1+B2 右为:A2+B3+B4
已此类推,可能有很多层,如上面的层,要求得到的结果为

userid name leftnumber rightnumber
1 x 5000 4900
2 t1 2200 1800
3 t2 2200 1900
4 a1 700 700
5 a2 600 500
6 a3 700 700
7 a4 600 500

要求点: 如X第一个分叉为 T1与T2,那所有的T1下面的值为左边,T2下面的值为右边
计算T1,第一个分叉为 A1与A2 那所有的A1下面的值为左边,A2下面的值为右边
非常感谢,考虑了很久还是没有很好的办法,
非常感谢Garnett_KG 的帮助,用Garnett_KG 的例程就是左数与右数的统计还有问题.
...全文
69 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ykwang 2008-09-17
  • 打赏
  • 举报
回复
啊Garnett_KG 非常不好意思,因为在你发贴给我之前,我做了左边与右边的统计,但我算出来左数与右数与你发给我的一样,但是我发觉我那样算有问题,就是左边与左边相加.
总之非常感谢你了.
lxuan_025 2008-09-17
  • 打赏
  • 举报
回复


可以用树形根节点与子节点存在唯一对应的关系。 X 01 ; t1 0101,t2 0102; a1 010101,a2 010102,a3 010201.......
Garnett_KG 2008-09-17
  • 打赏
  • 举报
回复

--测试数据&取子树部份的代码就不帖了.



SELECT *
INTO #tmp
FROM
(
SELECT * ,ISNULL((
SELECT SUM(Amount) FROM @Result WHERE grp LIKE a.grp+'%' AND Row>a.Row
),0) as totalamount

FROM @Result a
)t
WHERE totalamount is not null
order by grp,usertype

SELECT Row,userid,name,userbagid,usertype,
totalamount,
leftamout=(select top 1 amount+totalamount from #tmp where grp LIKE a.grp+'%' AND lvl=a.lvl+1 and usertype='left'),
rightamout=(select top 1 amount+totalamount from #tmp where grp LIKE a.grp+'%' AND lvl=a.lvl+1 and usertype='right')
FROM #tmp a
WHERE Totalamount>0

drop table #tmp

/*
Row userid name userbagid usertype totalamount leftamout rightamout
----------- ---------- ---------- ---------- ---------- ----------- ----------- -----------
1 1 x 001 0 9900 5000 4900
2 2 t1 1 left 4000 2200 1800
4 4 a1 2 left 1400 700 700
5 5 a2 2 right 1100 600 500
3 3 t2 1 right 4100 2200 1900
6 6 a3 3 left 1400 700 700
7 7 a4 3 right 1100 600 500


*/


Garnett_KG 2008-09-17
  • 打赏
  • 举报
回复
晕...你稍为改一下就可以了的呀,看来你还是没理解我的意思。

等一下,我帖给你。

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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