首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

树层的汇总统计,该如何处理

2012-01-18 
树层的汇总统计createtablea(idint,PIdint,Namevarchar(10))insertaselect1,0, 电脑--1unionallselect5,1,

树层的汇总统计
create       table       a(id   int   ,PId   int,     Name       varchar(10))      

      insert       a       select       1,0, '电脑 '   --   1
      union       all     select       5,1, '显示器 '---2
      union       all     select       8,5, '显像管 '----3
      union       all     select       9,5, '扇热片 '----3
      union       all     select       18,1, '键盘 '---2
      union       all     select       19,18, '螺丝 '----3
      union       all     select       20,18, '键扭 '----3

      union       all     select       2,0, '房子 '   ---1
      union       all     select       11,2, '电视 '---2
      union       all     select       13,11, '机顶合 '----3
      union       all     select       14,11, '遥控器 '----3
      union       all     select       21,2, '沙发 '---2
      union       all     select       22,21, '沙发套 '----3
      union       all     select       23,21, '靠枕 '----3

      union       all     select       4,0, '日用品 '---1
      union       all     select       12,4, '洗涤用品 '---2
      union       all     select       15,12, '牙膏 '----3
      union       all     select       16,12, '毛巾 '----3
      union       all     select       17,12, '衬衣 '----3
      union       all     select       24,4, '床上用品 '---2
      union       all     select       25,24, '床套 '----3
      union       all     select       26,24, '被单 '----3
      union       all     select       27,24, '枕套 '----3

--每一分支树得层数相同,数据保存仅保存最后一层数据

  create       table       b(bid   int   ,Id   int,     [mMoney]       int)      
      insert       b       select       1,8,10
        union       all     select       2,9,30    
          union       all     select       14,19,21
        union       all     select       15,20,10




        union       all     select       3,13,2
        union       all     select       4,14,18
        union       all     select       12,22,21
        union       all     select       13,23,21

      union       all     select       5,15,2
      union       all     select       6,16,21
      union       all     select       7,17,8    
        union       all     select       9,25,21
        union       all     select       10,26,8  
        union       all     select       11,27,7  

  关联统计想得到这样结果   分层统计。即将该层下的所有的数据汇总到当前层
可以的话   用存储过程   只需要传入   统计的层   等其它条件    
如果统计第一层   那么得到的结果

类型                         合计
-------------   -----------
  电脑                       71
  房子                       62    
  日用品                   67

如果统计第二层   那么得到的结果

类型                         合计
-------------   -----------
  显示器                       40
  键盘                           31
  电视                           20
  沙发                           42
  洗涤用品                   31
  床上用品                   36


[解决办法]
帮顶,接分
[解决办法]
DECLARE @a TABLE(id int ,PId int, Name nvarchar(10))
insert @a select 1,0,N '电脑 ' -- 1
union all select 5,1,N '显示器 '---2
union all select 8,5,N '显像管 '----3
union all select 9,5,N '扇热片 '----3
union all select 18,1,N '键盘 '---2
union all select 19,18,N '螺丝 '----3
union all select 20,18,N '键扭 '----3
union all select 2,0,N '房子 ' ---1
union all select 11,2,N '电视 '---2
union all select 13,11,N '机顶合 '----3
union all select 14,11,N '遥控器 '----3
union all select 21,2,N '沙发 '---2
union all select 22,21,N '沙发套 '----3
union all select 23,21,N '靠枕 '----3
union all select 4,0,N '日用品 '---1
union all select 12,4,N '洗涤用品 '---2
union all select 15,12,N '牙膏 '----3
union all select 16,12,N '毛巾 '----3


union all select 17,12,N '衬衣 '----3
union all select 24,4,N '床上用品 '---2
union all select 25,24,N '床套 '----3
union all select 26,24,N '被单 '----3
union all select 27,24,N '枕套 '----3
DECLARE @b TABLE(bid int ,Id int, [mMoney] int)
insert @b select 1,8,10
union all select 2,9,30
union all select 14,19,21
union all select 15,20,10


union all select 3,13,2
union all select 4,14,18
union all select 12,22,21
union all select 13,23,21

union all select 5,15,2
union all select 6,16,21
union all select 7,17,8
union all select 9,25,21
union all select 10,26,8
union all select 11,27,7


DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @a
WHERE PID=0
WHILE @@ROWCOUNT> 0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT cast(a.ID as varchar(10)),@Level,b.Sort+ ', '+cast(a.ID as varchar(10))
FROM @a a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

declare @lsb table(sort varchar(30),mMoney money)
insert @lsb
select t.sort,b.mMoney
from @t_level t LEFT JOIN @b b on ', '+t.sort+ ', ' like '%, '+cast(b.id as varchar(10))+ ',% '
where t.level=2


select f.id,f.name,sum(e.mMoney)
from @t_level d left join
@lsb e on charindex(d.sort,e.sort)> 0
inner join @a f on d.id=f.id
where level=1
GROUP BY f.id,f.name
order by f.id


id name
----------- ---------- ---------------------
5 显示器 40.0000
11 电视 20.0000
12 洗涤用品 31.0000
18 键盘 31.0000
21 沙发 42.0000
24 床上用品 36.0000

(6 row(s) affected)



[解决办法]
--test data
create table a(id int ,PId int, Name varchar(10))

insert a select 1,0, '电脑 ' -- 1
union all select 5,1, '显示器 '---2
union all select 8,5, '显像管 '----3
union all select 9,5, '扇热片 '----3
union all select 18,1, '键盘 '---2
union all select 19,18, '螺丝 '----3
union all select 20,18, '键扭 '----3

union all select 2,0, '房子 ' ---1
union all select 11,2, '电视 '---2
union all select 13,11, '机顶合 '----3
union all select 14,11, '遥控器 '----3
union all select 21,2, '沙发 '---2
union all select 22,21, '沙发套 '----3
union all select 23,21, '靠枕 '----3

union all select 4,0, '日用品 '---1
union all select 12,4, '洗涤用品 '---2
union all select 15,12, '牙膏 '----3
union all select 16,12, '毛巾 '----3
union all select 17,12, '衬衣 '----3
union all select 24,4, '床上用品 '---2
union all select 25,24, '床套 '----3
union all select 26,24, '被单 '----3
union all select 27,24, '枕套 '----3

go

create table b(bid int ,Id int, [mMoney] int)
insert b select 1,8,10
union all select 2,9,30


union all select 14,19,21
union all select 15,20,10


union all select 3,13,2
union all select 4,14,18
union all select 12,22,21
union all select 13,23,21

union all select 5,15,2
union all select 6,16,21
union all select 7,17,8
union all select 9,25,21
union all select 10,26,8
union all select 11,27,7
go
-----------------------------------------

create function getSumMoney(
@id int
)returns int
as
begin
declare @s int
select @s=isnull(sum(mMoney),0) from b where bid=@id
if exists(select * from a where pid=@id)
select @s=@s+isnull(sum(dbo.getSumMoney(id)),0) from a where pid=@id
return @s
end


go
create procedure stat
@n int--层数 n> 0
as
begin
declare @str varchar(8000)
set @str= 'select id from a where pid=0 '
set @n=@n-1
while @n> 0
begin
set @str= 'select id from a where pid in ( '+@str+ ') '
set @n=@n-1
end
set @str= 'select name,dbo.getsummoney(id) as totalmoney from a where id in( ' +@str+ ') '
exec(@str)
end
go
--test
exec stat 1
exec stat 2

------------
drop table a
drop table b
drop function dbo.getsummoney
drop proc stat

[解决办法]
好题目.楼主牛
接分

热点排行