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
)