sqlbom
Ⅰ sql 两层BOM查询,求教
如果确定只有两层,可以用sql查出,思路:
1、整体分两部分,第一部分查出所有的主料,“是否有下一层”为0
2、两个bom表关联,用子物料名与主物料名关联,查出所有包含子物料的主物料名
3、第一部分查出来的数据与第二部分关联,用物料名称关联,取第二部分主物料名为null,条件限制之后,就能取出所有真正的没有子物料的主物料
4、用3的结果与2的结果union all,取得所有要的结果。
查询之前,先要给bom表做一个主键id字段,要不然还得做联合主键,更麻烦了。
sql语句如下:
select c.* from bom c, (select b.id,b.主物料,b.子物料,b.数量 from bom a,bom b
where a.主物料=b.子物料) d
where c.id=d.id and d.id is null and c.是否下一层=0
union all
select f.* from (select d.id,d.主物料,d.子物料,d.数量 from bom e,bom d where e.主物料=d.子物料) f
真正做的时候,可以将第二部的关联,做成一个临时表,这样就不用写两次sql语句了。
Ⅱ 新人求教sql循环查询BOM
你这个是交展BOM,也就是树状图方式展现层级。
一般可以用 CONNECT BY 这个函数。
如果数据库量大,则建议自己写一个存储过程了。
Ⅲ SQL中多阶BOM依次展开及按级次顺序显示问题
看你前面一个答案是说易飞ERP的BOM程式﹐我就直接帮你写易飞的SQL吧﹐参考以下代码
会用到一个临时表
DECLARE@MC001VARCHAR(20)
DECLARE@MD001VARCHAR(20)
DECLARE@NEXTINT
DECLARE@LEVELINT
SET@MC001='901-001'
SET@NEXT=0
SET@LEVEL=0
CREATETABLE#BOMTREE
(
LEVELINT,--阶层
MD001VARCHAR(20),--主件品号
MD003VARCHAR(20),--元件品号
MD006INT,--组成用量
MD007INT,--底数
MB025VARCHAR(10),--品号属性
MB026VARCHAR(10),--低阶码
MB046NUMERIC(17))--标准进价
IFEXISTS(SELECT*FROMBOMMDWHEREMD001=@MC001)
BEGIN
WHILE@NEXT<2
BEGIN
IF@NEXT=0
BEGIN
INSERTINTO#BOMTREESELECT@LEVELASLEVEL,@MC001,@MC001,1,1,'M','00',0
INSERTINTO#BOMTREESELECT@LEVELASLEVEL,MD001,MD003,MD006,MD007,MB025,MB026,=MB001WHEREMD001=@MC001
SET@NEXT=1
END
IF(SELECTCOUNT(MD001)FROM#BOMTREEWHERELEVEL=@LEVELAND(MB025='M'ORMB025='S'))>0AND@NEXT=1
BEGIN
SET@LEVEL=@LEVEL+1
INSERTINTO#BOMTREESELECT@LEVELASLEVEL,MD001,MD003,MD006,MD007,MB025,MB026,=MB001WHEREMD001IN(SELECTMD003FROM#BOMTREEWHERE(MB025='M'ORMB025='S')ANDLEVEL=@LEVEL-1)
SET@NEXT=1
END
ELSE
BEGIN
SET@NEXT=2
END
END
--更新上阶制费
DECLARE@COUNTINT
SELECT@COUNT=COUNT(DISTINCTLEVEL)FROM#BOMTREE
WHILE@COUNT>0
BEGIN
--SUM((CONVERT(DECIMAL(16,6),MD006)/CONVERT(DECIMAL(16,6),MD007)*MB046))有底数的BOM
UPDATE#BOMTREESETMB046=B.NEW_MB050FROM#BOMTREEA,(SELECTMD001,SUM((MD006/MD007)*MB046)ASNEW_MB050FROM#BOMTREEWHERELEVEL=@COUNTGROUPBYMD001)BWHERE(MB025='M'ORMB025='S')ANDA.MD003=B.MD001ANDLEVEL=@COUNT-1
SET@COUNT=@COUNT-1
END
END
SELECT*FROM#BOMTREE
DROPTABLE#BOMTREE
效果参考下图
Ⅳ 求助提高SQL语句展开BOM最底层清单的速度
求助提高SQL语句展开BOM最底层清单的速度
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
Ⅳ bom结构SQL问题怎样写呢
MSSQLserver
with tmp as
( select * from boms where id = ??
union all
select * from boms a,tmp b where a.xiaid = b.id )
select * from tmp
Ⅵ SQL 存储过程中,类似于BOM相关,根据最底层物料找其对应的最顶层物料
--你的数据,只能找到A7,找到不到A1的
--建表
createtableT
(
父VArchar(20),
子VArchar(20)
)
--插入数据
InsertintoTvalues('A1','A2')
InsertintoTvalues('A2','A3')
InsertintoTvalues('A3','A5')
InsertintoTvalues('A3','A4')
InsertintoTvalues('A5','A6')
--循环展开BOM
Declare@Iint
Set@I=1
Select父,子,@IAs层,父+'-'+子Ascpathinto#tmpfromTwhere子='A6'
while@@ROWCOUNT>0
Begin
Set@I=@I+1
Insertinto#tmp
SelectA.父,A.子,@I,B.cpath+'-'+A.子FromTAinnerjoin#tmpB
onA.子=B.父and层=@I-1
End
--查询按路径的排序
Select*from#tmporderbycpathdesc
--查询最顶层的物料
Select*from#tmpwhere层=@I-1
DropTable#tmp
Ⅶ SQL如何查询出BOM清单信息,急急急!
select bomchild.fitemid,bomchild.YFfqy,bomchild.Fqty(我不知道这个值是怎么计算的,所以只能这么写在这里) from bom,bomchild where bom.bomid=bomchild.bomid and bom.fitemid <> bomchild.fitemid
如果FitemId=001是你输入的,那么就在后面加上一个 and bom.fitemid='001' 应该就行了。
如果不加那么得到的就应该是表2,去掉and bom.fitemid <> bomchild.fitemid 应该就是表1了。
Ⅷ sql BOM查询
--2005 用CTE很简单的;with t as(
select * from [tb] where col1='河北省'
union all
select a.* from [tb] a ,t where a.col2=t.id)
select * from t
/*
id col1 col2
----------- -------- -----------
1 河北省 0
2 邢台市 1
3 石家庄市 1
4 张家口市 1
6 坝上 4
5 南宫 2
7 任县 2
8 清河 2(8 行受影响)
*/
Ⅸ sql代码,代码精简,bom表要算到多层
要查询到最底层物料的数量,这要看这个"底层"是如何定义的,从你的代码来看,应该是没有下一阶的物料就为"底层"物料。
但是,以此"底层"定义来看,示例SQL还是有疏漏的地方:假设djm为1,可能有不存在以其child为parent的记录,那么这样的物料应该也算作"底层"(即t2.child也为null的情况, 当然从此示例的数据来看是没有这样的记录. 可以想象加入一条记录: paent: A, child: NA, num: 11, djm: 1),但是示例代码中没有考虑这种情况。考虑此种情况的话,应该用COALESCE或类似函数来获得"物料"和“数量”的值: COALESCE(t3.child, t2.child, t1.child) as "物料".
而回到"底层"的定义上,查询就很简单:找到没有下一阶物料的记录就可以了:
selectb.childas"物料",b.numas"数量"
fromB_bomb
wherenotexists(
selectc.parent
fromB_bomc
wherec.parent=b.childandc.djm=b.djm+1
)