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

SQL有关问题,请教结构菜单计算有关问题

2012-02-01 
SQL问题,请问结构菜单计算问题?表结构如下:结构序号物品编号物品类型物品名称父件编号物品用量1001产品ANU

SQL问题,请问结构菜单计算问题?
表结构如下:

结构序号 物品编号 物品类型 物品名称 父件编号 物品用量  
  1 001 产品 A NULL NULL  
  2 002 产品 B NULL NULL  
  3 003 零部件 C 001 3  
  4 004 零部件 D 001 2  
  5 005 原材料 E 003 4
  6 006 原材料 F 003 3
  7 007 原材料 G 004 5  
  8 003 零部件 C 002 4  
  9 009 零部件 H 002 3
 10 005 原材料 E 009 1
 11 006 原材料 F 009 1
请问:如何SQL查询父编号之下的物品总用量
例如:按001查时需查到 
  003 C 3个  
  004 D 2个 
  005 E 4*3个 
  006 F 3*3个 
  007 G 5*2个  
  按003查询时需查到
  005 E 4个 
  006 F 3个 

 

[解决办法]

SQL code
--bom成本计算?表一:品号信息档 品号     品号属性   材料成本   人工成本     本阶人工 MB001     MB025         MB057       MB058             MB061 A               M                                                     2 B               M                                                     1 C               P                   2 D               P                   3                               (MB025=M   时只有本阶人工是基础数据,其他的是计算过来的,MB025=P时只有MB057有基础数据) 表二(BOM) 主件品号     元件品号     用量 A                         B               2(A由2个B组成) B                         C               1     (B由1个C和3个D组成) B                         D               3 计算原理: 1、计算MB025=M   的人工成本,人工成本=本阶人工+下阶人工成本 2、计算材料成本,材料成本=本阶用到材料+下阶材料之和(如本例 结果: MB001     MB025         MB057       MB058             MB061 A               M                   22           4                   2 B               M                   11           1                   1 C               P                   2             0                   0 D               P                   3             0                   0 11=(3D+1C)=11 22=11*2 4=2B+2 gocreate table BOM(主件品号 nvarchar(2),元件品号 nvarchar(2), 用量 int)insert  BOM select 'A','B',2 insert  BOM select 'B','C',1 insert  BOM select 'B','D',3 gocreate table product(MB001 nvarchar(2),    MB025  nvarchar(2),  MB057 int,  MB058 int,  MB061 int)insert product select 'A','M',null,null,   2 insert product select 'B','M',null,null,  3-----改为3测试 insert product select 'C','P', 2 ,null,nullinsert product select 'D','P', 3 ,null,nullgogocreate function BomTree(@Product nvarchar(2))returns numeric(18,5)asbegindeclare @T table(主件品号 nvarchar(2),元件品号 nvarchar(2), 用量 int,lev int)declare @i int,@num numeric(18,5)if not exists(select 1 from BOM where 主件品号=@Product)    begin        select             @num=sum(MB057)        from             product        where            MB001=@Product        return @num    endset @i=0insert @T select 主件品号,元件品号,用量,@i from BOM where 主件品号=@Productwhile @@rowcount>0begin    set @i=@i+1    insert @T    select         t2.主件品号,t2.元件品号,t.用量*t2.用量,@i    from @t t join BOM t2 on t.元件品号=t2.主件品号    where t.Lev=@i-1endselect     @num=sum(t.用量*case when t2.MB057>0 then t2.MB057  else 1 end)from     @t t join     product t2 on t.元件品号=t2.MB001where    not exists(select 1 from @t where t.元件品号=主件品号)return @numendgocreate function BomTree2(@Product nvarchar(2))returns numeric(18,5)asbegindeclare @T table(主件品号 nvarchar(2),元件品号 nvarchar(2), 用量 int,lev int)declare @i int,@num numeric(18,5)if not exists(select 1 from BOM t where 主件品号=@Product and not exists(select 1 from product where MB001=t.元件品号 and isnull(MB061,0)!>0))    begin        select             @num=sum(isnull(MB061,0))        from             product        where            MB001=@Product        return @num    endset @i=0insert @T select 主件品号,元件品号,用量,@i from BOM where 主件品号=@Productwhile @@rowcount>0begin    set @i=@i+1    insert @T    select         t2.主件品号,t2.元件品号,t.用量*t2.用量,@i    from @t t join BOM t2 on t.元件品号=t2.主件品号    where t.Lev=@i-1endselect     @num=sum(t.用量*isnull(t2.MB061,1))from     @t t join     product t2 on t.元件品号=t2.MB001------改一下判断where    not exists(select 1 from product where MB001=t.元件品号 and isnull(MB061,0)!>0)return @numendgoselect     MB001,    MB025 ,  [MB057]=dbo.BomTree(MB001),  [MB058]=isnull([MB061],0)+dbo.BomTree2(MB001),  [MB061]=isnull([MB061],0)from        productgo--drop table product,BOM--drop function BomTree,BomTree2MB001 MB025 MB057                MB058                 MB061       ----- ----- -------------------- --------------------- ----------- A     M     22.00000             8.00000               2B     M     11.00000             6.00000               3C     P     2.00000              .00000                0D     P     3.00000              .00000                0(所影响的行数为 4 行) 


[解决办法]

SQL code
--写个函数create function dbo.fn_GetChild(@物品编号 varchar(10))returns @r table (   物品编号 varchar(10),   物品名称 varchar(100),   物品用量    int,   层次     int   )asbegin   declare @l int   set @l=0   insert @r select      物品编号,     物品名称,     物品用量,     层次=0   from Tab   where 父件编号=@物品编号   while exists (select 1     from Tab a,@r b     where a.父件编号=b.物品编号      and b.层次=@l     )   begin     insert @r select        a.物品编号,       a.物品名称,       a.物品用量*b.物品用量 as 物品用量,       层次=@l+1     from Tab a,@r b     where a.父件编号=b.物品编号      and b.层次=@l     set @l=@l+1   end      returnendgo--调用select        物品编号,       物品名称,       物品用量     from dbo.fn_GetChild('001')goselect        物品编号,       物品名称,       物品用量     from dbo.fn_GetChild('003')go
[解决办法]
对啊,数据都存函数里了,你只要group by就出来了
[解决办法]
SQL code
create table tb(结构序号 int,物品编号 varchar(50),物品类型 varchar(50),物品名称 varchar(50),父件编号 varchar(50),物品用量 int)insert into tb select 1,'001','产品','A','',0insert into tb select 2,'002','产品','B','',0insert into tb select 3,'003','零部件','C','001',3insert into tb select 4,'004','零部件','D','001',2insert into tb select 5,'005','原材料','E','003',4insert into tb select 6,'006','原材料','F','003',3insert into tb select 7,'007','原材料','G','004',5insert into tb select 8,'003','零部件','C','002',4insert into tb select 9,'009','零部件','H','002',3insert into tb select 10,'005','原材料','E','009',1insert into tb select 11,'006','原材料','F','009',1create     function   wsp_a(@物品编号 varchar(50))   returns   @t   table(物品编号 varchar(50),物品名称 VARCHAR(50),父件编号 VARCHAR(50),物品用量 int,Level int)   as   begin         declare  @i  int      set   @i=1         insert   into  @t select 物品编号,物品名称,父件编号,物品用量,@i from tb where 父件编号=@物品编号      while   @@rowcount<>0      begin                set   @i=@i   +   1              insert into @t  select a.物品编号,a.物品名称,a.物品用量,a.父件编号,@i   from  tb  a,@t b        where  a.父件编号=b.物品编号 and b.Level=@i-1         end         return   end   -----查询'001'时select 物品编号,物品名称,物品用量=case 父件编号 when '001' then ltrim(物品用量)+'个'else 父件编号+'*'+ltrim(物品用量)+'个' end from dbo.wsp_a('001')-----查询'003'时select 物品编号,物品名称,物品用量=case 父件编号 when '003' then ltrim(物品用量)+'个'else 父件编号+'*'+ltrim(物品用量)+'个' end from dbo.wsp_a('003') 

热点排行