1

私はこれを研究してきましたが、まだ有用な答えを見つけていません。私は SQL Server の中程度のハックであり、関数とストアド プロシージャでパラメーターを使用することにある程度成功していますが、これは理解できない組み合わせです。

わかりやすくするために、私のシナリオを要約すると次のようになります。次のように、Computer_Type、Model_Num、および Mix_Percent を維持する tbl_Computers があります。

Desktop  ABC  .75  
Desktop  XYZ  .25  
Laptop   DEF  .60  
Laptop   MNO  .40

また、Computer_Type、Jul_Num、Aug_Num、Sep_Num を次のように管理する月別の予測テーブルもあります。

Desktop  100  200  150  
Laptop   300  400  700

特定のモデルについて、過去 12 か月間に販売されたすべてのコンポーネントとアクセサリを検索する計画部品表の関数を作成しました。次のように動作します:
P_BOM ("ABC") は、Component と Comp_Percent の 2 つの列を持つテーブルになります。

CPU        1  (This means we sell 1 CPU with every desktop)  
Hard Drive 2  (We sell 2 with every desktop)  
Printer    .8 (80% of the time we sell a printer)

ストアド プロシージャで実行したいのは、次のヘッダー Component、Jul_Num、Aug_Num、および Sep_Num を使用して、次のように見える単一の結合テーブルを提供することです。

CPU         400  600  850  
Hard Drive  500  800  1000

次のロジックを合計して CPU 数を取得します:
デスクトップの Jul_Num x ABC の Mix_Percentage x ABC の CPU Comp_Percent
デスクトップの Jul_Num x XYZ の Mix_Percentage x XYZ の CPU Comp_Percent
ラップトップの Jul_Num x ABC の Mix_Percentage x ABC の CPU
Comp_Percent
100 x 0.75 x 1) + (100 x 0.25 x 1) + (300 x 0.6 x 1) + (300 x 0.4 x 1)

何か案は?

ありがとう、
ロブ

編集:

これは反復的な問題ではなく、テーブルベースのソリューションである必要があるという提案に感謝します。

この最初のテーブルを作成して、次のようにしました。

ABC CPU          3  3   1
ABC Hard Drive   6  3   2
DEF CPU          2  2   1
DEF Hard Drive   2  2   1
MNO CPU          1  1   1
MNO Hard Drive   1  1   1
XYZ CPU          1  1   1
XYZ Hard Drive   2  1   2

SQLは次のとおりです。

SELECT        All_Components.Model_Num, All_Components.Part_Num, SUM(All_Components.Qty) AS Total, TTO.Target_Total, SUM(All_Components.Qty) 
                     / TTO.Target_Total AS Comp_Percent
FROM            (SELECT        Test_tbl_Computers.Model_Num, Test_tbl_Orders_2.Order_Num, Test_tbl_Orders_2.Part_Num, Test_tbl_Orders_2.Qty
                      FROM            Test_tbl_Orders AS Test_tbl_Orders_2 CROSS JOIN
                                                Test_tbl_Computers) AS All_Components INNER JOIN
                         (SELECT        Test_tbl_Orders.Part_Num, SUM(Test_tbl_Orders.Qty) AS Target_Total
                           FROM            Test_tbl_Orders INNER JOIN
                                                     Test_tbl_Computers AS Test_tbl_Computers_1 ON Test_tbl_Orders.Part_Num = Test_tbl_Computers_1.Model_Num
                           GROUP BY Test_tbl_Orders.Part_Num) AS TTO ON All_Components.Model_Num = TTO.Part_Num
WHERE        (All_Components.Order_Num IN
                         (SELECT        Order_Num
                           FROM            Test_tbl_Orders AS Test_tbl_Orders_1
                           WHERE        (Part_Num = All_Components.Model_Num))) AND (All_Components.Part_Num <> All_Components.Model_Num)

次に、飼いならすことができない SQL モンスターにならないようにするために、別の関数を作成して、予測と混合パーセンテージへの内部結合を実行し、Part_Num でグループ化されたすべての数値を合計しました。

何よりも、自分の考えに集中するために質問を書き留めなければならないことに感謝しています。

4

2 に答える 2

1

"Computer_Type、Jul_Num、Aug_Num、および Sep_Num"

1 か月に 1 列は、レポートやデータ入力インターフェイスには有効ですが、実際にそのようにデータを保存すると、絶対におかしくなってしまいます。戻ってそのテーブルを "Computer_Type, Year, Month, Num" または "Computer_Type, Date, Num" に変更する手段がある場合は、最初にそれを行う必要があります。

于 2013-07-03T16:34:27.580 に答える
0

ここで関数が必要な理由がわかりません。ここで述べているすべてのデータは、テーブルに保存してから、単純な結合で取得できます。BOM が再帰的であっても、CTE を利用できます。

関数の使用を主張する場合はCROSS APPLY、関数を各行に呼び出すために使用できます。


これまでに作成した唯一の関数は、特定のデスクトップ モデルと同じ受注で販売されたすべてのコンポーネントで満たされた 2 列のテーブルを作成することでした。そのテーブルの結果を別のテーブルに投稿し、関数のインスタンスごとに新しい行を挿入し続けることをお勧めしますか?

なるほど、関数を使う必要はありません。さまざまな可能性があり、

あなたがおそらくそれに非常に近いものは、関数をSPに変換し、

INSERT INTO [TableName]
EXEC [SP_NAME]

別のクエリは、クエリを累積サブクエリまたは CTE (以下を参照) に変換し、他のクエリと結合します。

一般に、データベースに大きなダメージを与えるため、可能な限り関数を作成することは避けてください。

BOM は再帰的ではありません。私はCTEに精通していません。

共通テーブル式 (CTE) は、連結されたサブクエリが多数ある場合に優れたツールです。慣れると、複雑なクエリが明確になります (IMO)。CTE は、再帰のネイティブ サポートも提供します。ネットには参考になる記事が山ほどあります。CTEの例またはCTEのチュートリアルをグーグルで検索してください

CROSS APPLY の経験はありません。

CROSS APPLY: ページhttp://technet.microsoft.com/en-us/library/ms175156(v=sql.105).aspxから

APPLY 演算子を使用すると、クエリの外部テーブル式によって返される各行に対してテーブル値関数を呼び出すことができます。

最後になりました

任意の例をいただければ幸いです

既にお持ちの部分的なスクリプトを教えていただければ、ガイドとして意図したクエリに変換してみます。

于 2013-07-03T16:40:31.007 に答える