SQL中多阶BOM依次展开及按级次顺序显示问题

下图为要实现的具体图,请高手帮忙做一个存储过程,分数还可以增加。不能修改基础表的结构,查询后的结构一定要按级次顺序展开。按lzh3452提问修改了一下,品名是可以用主件品... 下图为要实现的具体图,请高手帮忙做一个存储过程,分数还可以增加。不能修改基础表的结构,查询后的结构一定要按级次顺序展开。
按lzh3452提问修改了一下,品名是可以用主件品名与子件品名。分数也做提高了。
展开
 我来答
百度网友7558ae7
推荐于2017-12-16 · TA获得超过5797个赞
知道小有建树答主
回答量:1730
采纳率:50%
帮助的人:1707万
展开全部

看你前面一个答案是说易飞ERP的BOM程式﹐我就直接帮你写易飞的SQL吧﹐参考以下代码

会用到一个临时表

DECLARE @MC001 VARCHAR(20)
DECLARE @MD001 VARCHAR(20)
DECLARE @NEXT INT
DECLARE @LEVEL INT
SET @MC001='901-001'
SET @NEXT=0
SET @LEVEL=0
CREATE TABLE  #BOMTREE
(
LEVEL INT,--阶层
MD001 VARCHAR(20),--主件品号
MD003 VARCHAR(20),--元件品号
MD006 INT,--组成用量
MD007 INT,--底数
MB025 VARCHAR(10),--品号属性
MB026 VARCHAR(10),--低阶码
MB046 NUMERIC(17))--标准进价

IF EXISTS(SELECT * FROM BOMMD WHERE MD001=@MC001)
BEGIN 
WHILE @NEXT<2
BEGIN
IF @NEXT=0
BEGIN
INSERT INTO  #BOMTREE SELECT @LEVEL AS LEVEL,@MC001,@MC001,1,1,'M','00',0
INSERT INTO  #BOMTREE SELECT @LEVEL AS LEVEL, MD001,MD003,MD006,MD007,MB025,MB026,MB046  FROM BOMMD LEFT JOIN INVMB ON MD003=MB001 WHERE MD001=@MC001
SET @NEXT=1
END
IF (SELECT COUNT(MD001) FROM #BOMTREE WHERE LEVEL=@LEVEL AND (MB025='M' OR MB025='S'))>0 AND @NEXT=1 
BEGIN
SET @LEVEL=@LEVEL+1
INSERT INTO  #BOMTREE SELECT @LEVEL AS LEVEL, MD001,MD003,MD006,MD007,MB025,MB026,MB046 FROM BOMMD LEFT JOIN INVMB ON MD003=MB001 WHERE MD001 IN(SELECT MD003 FROM  #BOMTREE WHERE (MB025='M' OR MB025='S') AND LEVEL=@LEVEL-1)
SET @NEXT=1
END
ELSE
BEGIN
SET @NEXT=2
END
END
--更新上阶制费
DECLARE @COUNT INT
SELECT @COUNT=COUNT(DISTINCT LEVEL) FROM #BOMTREE
WHILE @COUNT>0
BEGIN
--SUM((CONVERT(DECIMAL(16,6),MD006)/CONVERT(DECIMAL(16,6),MD007)*MB046))有底数的BOM
UPDATE  #BOMTREE  SET MB046=B.NEW_MB050 FROM #BOMTREE A ,(SELECT MD001,SUM((MD006/MD007)*MB046)  AS NEW_MB050 FROM #BOMTREE  WHERE LEVEL=@COUNT GROUP BY MD001) B  WHERE (MB025='M' OR MB025='S')  AND A.MD003=B.MD001 AND LEVEL=@COUNT-1
SET @COUNT=@COUNT-1
END
END

SELECT * FROM  #BOMTREE
DROP TABLE #BOMTREE

效果参考下图

更多追问追答
追问

追答

恩﹐是有点问题﹐展了两次﹐重新修正了一下﹐并增加了查询排序,显示品名

--代码放不下了﹐你查看附件吧

效果﹕


精神上的学习
2013-08-22
知道答主
回答量:1
采纳率:0%
帮助的人:1472
展开全部
可以用结果一
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lzh3452
2013-08-22 · TA获得超过1044个赞
知道小有建树答主
回答量:1168
采纳率:100%
帮助的人:864万
展开全部
品号表的单价不全,计算还得写个函数,不如先查出来DEF的单价存在变量里,然后写个方法,传入参数是DEF的单价和名称,处理是根据这四个参数和换算关系计算成本并返回。
select T1.低阶码, T1.品号 AS 元件品号, T1.品名 AS 元件品名, Sum(FncJisanChengBen(T2.名称, 单价D, 单价E, 单价F)) 标准成本
from product T1, bom T2
where T1.品号=T2.主件品名 AND T1.名称=T2.品名 AND T1.品名 = 'A'
这就是结果A了

但你说不能改表结构,可是你bom表里有两个品名列,这是不可能的!
追问
BOM中的两列品名已经分别用主件品名,和子件品名了,请给答案,分数也提高了。
追答

那就改下sql呗

select T1.低阶码, T1.品号 AS 元件品号, T1.品名 AS 元件品名, Sum(FncJisanChengBen(T2.子件品名, 单价D, 单价E, 单价F)) 标准成本
from product T1, bom T2
where T1.品号=T2.主件品名 AND T1.名称=T2.主件品名 AND T1.品名 = 'A'

这样就行了

FncJisanChengBen这个用if 判断子件品名的值就行

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1346288e6
2013-08-22 · TA获得超过127个赞
知道答主
回答量:100
采纳率:0%
帮助的人:46万
展开全部
老大,不是不给你解答,而是这点分,不值得你怎么复杂的题
追问

要多少分,你给个话。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式