2016-08-25 7 views
2

部品表(BOM)があります。 BOM 301755 301755.SQLサーバー部品表/配合表の数量の照会

このBOMを呼び出すことができます。これは、レベルゼロになり、これらの部品

31161201 = need 1 pc of this 
    29975413 = need 2 pcs of this 
    299756 = need 2 pcs of this 
    And 305958 = need 1 pc of this 

で作られています。

現在、パーツの1つにフォーカスを当てます。パート:私が描く

PLTSSL902 = 1pc x 2 = 2 pc 
    CAPSSL902 = 1pc x 2 = 2 pc 
    PIPSSL4SCH40 = 3.96 x 2 = 7.92 
    And LABSTR = 0.166 x 2 = 0.332 

:私たちはどのように次のように表示されますので、私は、クエリを行うことができます29975413. の2個を必要とするので、

PLTSSL902 = 1pc 
CAPSSL902 = 1pc 
PIPSSL4SCH40 = 3.96 
And LABSTR = 0.166 

:29975413がで作られて29975413. パートこれは簡単にenter image description hereを読むためにこれを読んでください。 :)

は、このような

答えて

1

を含むことができ、再帰的な共通テーブル式を使用すると、パーツの階層を歩くことができます。親の数量を計算し、それに子供の数量を掛けます。

;WITH bom as (
    SELECT pid p,cid c, qty q, 0 bomlvl FROM #t WHERE pid='301755' // start id 
    UNION ALL 
    SELECT pid, cid, q*qty, bomlvl+1 FROM #t INNER JOIN bom ON c=pid 
) 
SELECT * from bom a WHERE NOT EXISTS (SELECT 1 FROM bom WHERE p=a.c) 

この問合せは、各ラインのためのBOMレベルを計算し、唯一のリストのみが一覧表示されます:

DECLARE @bom int = 301755 

CREATE TABLE #t(
    BOM int, 
    KitID varchar(20), 
    SubAssy varchar(20), 
    BOMLevel int, 
    StdQty float 
) 

INSERT #t(BOM, KitID, SubAssy, BOMLevel, StdQty) VALUES 
     (301755, '301755', '31161201', 0, 1), 
     (301755, '301755', '29975413', 0, 2), 
     (301755, '301755', '299756', 0, 2), 
     (301755, '301755', '305958', 0, 1), 
     (301755, '305958', '311620', 1, 4), 
     (301755, '305958', '311620', 1, .1), 
     (301755, '299756', 'RDBSSL012', 1, .1), 
     (301755, '299756', 'RDBSSL012', 1, 3.417), 
     (301755, '29975413', 'PLTSSL902', 1, 1), 
     (301755, '29975413', 'CAPSSL4SCH40', 1, 1), 
     (301755, '29975413', 'PIPSSL4SCH40', 1, 3.96), 
     (301755, '29975413', 'LABSTR', 1, .166), 
     (301755, '31161201', 'PIPSSL2SCH40', 1, 4) 

;WITH cte AS (
    SELECT KitID, SubAssy, StdQty FROM #t WHERE KitID = @bom 
UNION ALL 
    SELECT #t.KitID, #t.SubAssy, cte.StdQty * #t.StdQty FROM #t 
    INNER JOIN cte ON cte.SubAssy = #t.KitID 
) 


SELECT * FROM cte ORDER BY KitID, SubAssy 
+0

にしていただき、ありがとうございました。私はこのようなことを期待していました。私は何かが足りないことを知っている。私はこれが私の解決だと思う。私はそれを試して、あなたに知らせることができます – BobNoobGuy

1

何かが動作するはずありがとう:

CREATE TABLE #TableBom 
(
Bom INT 
,KitId INT 
,SubAssy VARCHAR(20) 
,BomLevel INT 
,StdQty DECIMAL(10 ,3) 
); 

INSERT INTO #TableBom 
SELECT 301755, 301755, '29975413', 0, 2 
UNION ALL 
SELECT 301755, 29975413, 'PLTSSL902', 1, 1 
UNION ALL 
SELECT 301755, 29975413, 'CAPSSL902', 1, 1 
UNION ALL 
SELECT 301755, 29975413, 'PIPSSL4SCH40',1,3.96 
UNION ALL 
SELECT 301755, 29975413, 'LABSTR', 1, 0.166 
UNION ALL 
SELECT 301755, 299756, 'RDBSSL012', 1, 3.147 

SELECT b.Bom 
    ,b2.SubAssy 
    ,CONCAT(b2.SubAssy, ' = ' ,CAST(b2.StdQty AS DECIMAL(10,3)) ,' pc x ' ,CAST(b.StdQty AS DECIMAL(10,3)) ,' = ' ,CAST((b2.StdQty * b.StdQty) AS DECIMAL(10,2)) ,' pc') AS Calc 
FROM #TableBom AS b 
    INNER JOIN #TableBom AS b2 ON b.SubAssy = CAST(b2.KitId AS VARCHAR(20)); 

Bom SubAssy Calc 301755 PLTSSL902 PLTSSL902 = 1.000 pc x 2.000 = 2.00 pc 301755 CAPSSL902 CAPSSL902 = 1.000 pc x 2.000 = 2.00 pc 301755 PIPSSL4SCH40 PIPSSL4SCH40 = 3.960 pc x 2.000 = 7.92 pc 301755 LABSTR LABSTR = 0.166 pc x 2.000 = 0.33 pc

EDIT: をあなたが唯一の29975413を含めたい場合は、WHERE b.SubAssy = '29975413'

+0

ちょっと感謝を取得します。申し訳ありませんが、私はそのような書式設定をするつもりはありませんでした。私はちょうど計算を行う方法のアイデアが必要です..しかし、私はこれを試してみましょう。 – BobNoobGuy

+0

Ahh ok。コンカットからすべてを取り出して、 '(b2.StdQty * b.StdQty)'を – Doolius

2

は、もう少し一般的な応用では、私はのは少しに答えるdazedandconfused @に変更ようにするにはのBOMの要素には、BOMが持つ可能性のあるレベルの数に関係なく、の子はありません。フィドルはhereです。

私の例では、結果をお届けします。

p  c   q  bomlvl 
-------- ------------ ----- ------ 
305958 311620  4  1  
305958 311620  0.1 1  
299756 RDBSSL012 0.2 1  
299756 RDBSSL012 6.834 1  
29975413 PLTSSL902 2  1  
29975413 CAPSSL4SCH40 2  1  
29975413 PIPSSL4SCH40 7.92 1  
29975413 LABSTR  0.332 1  
31161201 PIPSSL2SCH40 4  1  

あなたは、特定のBOMで使用される彼らの総量を取得するために彼らのc -idにより、さらに一歩とグループの結果を行くことができます。テーブル値関数は、これを書くための最善の方法で、初期Idをパラメータとして渡します。関数が一時テーブルを参照することはできませんので、私は私のdata.stackexchange-バイオリンでこれを立証することはできませんが、関数の定義は次のように多かれ少なかれになります。

CREATE FUNCTION bomqty (@pid varchar(20)) RETURNS TABLE AS BEGIN 
;WITH bom as (
    SELECT pid p,cid c, qty q, 0 bomlvl FROM tbl WHERE [email protected] 
    UNION ALL 
    SELECT pid, cid, q*qty, bomlvl+1 FROM tbl INNER JOIN bom ON c=pid 
) 
RETURN SELECT c item,sum(q) totalqty FROM bom a 
     WHERE NOT EXISTS (SELECT 1 FROM bom WHERE p=a.c) 
     GROUP BY c 
END; 

機能し、このような他のテーブルと同じように使用することができます。

SELECT * FROM bomqty('301755') 

これは、あなたの答えのために

item   totalqty 
------------ -------- 
311620  4.1  
CAPSSL4SCH40 2   
LABSTR  0.332  
PIPSSL2SCH40 4   
PIPSSL4SCH40 7.92  
PLTSSL902 2   
RDBSSL012 7.034 
+0

"存在しない"の使用に関する興味深いヒント。私はそれを試してみましょう。ありがとうございました – BobNoobGuy

関連する問題