次の場合の基本的なスキーマ設計を思い付かなければならないトレーニング演習として、単純なデータベース設計タスクを実行しています。
製品の親子階層があります(例:原材料>作業中>最終製品)。
- 注文は各レベルで行われます。
- 注文数は、次の6か月間、毎週のバケットで確認できます。
- 製品レベルごとに需要予測を行うことができます。
- 次の6か月以内の任意の週の需要予測を今日行うことができます。
- 需要予測は、次の6か月間の毎週のバケットに対して行われます。
需要予測は通常、階層の上位レベル(原材料または仕掛品レベル)で行われます。下位レベル(最終製品)に分解する必要があります。
需要予測を上位レベルから下位レベルに分解する方法は2つあります。
- ユーザーは最終製品の割合分布を指定します。たとえば、作業中の予測は1000だとします。ユーザーは、バケット10の最終製品1に40%、最終製品2に60%が欲しいと言っています。次に、今から10週目(日曜日から土曜日)の予測値最終製品1の場合は400、最終製品2の場合は600になります。
- ユーザーは、バケット5の最終製品に対する注文に従って分解するだけで、バケット5の最終製品1と2の注文はそれぞれ200と800であり、EP1の予測値は((200/1000)* 100)%になります。 EP2の場合、「(作業中)」の予測の((800/1000)* 100)%になります。
予測は次の6か月間、毎週バケットで表示可能であり、理想的な形式は次のとおりです。
product name | bucket number | week start date | week end date | forecast value | created_on
PRODUCT_HIERARCHYテーブルは次のようになります。
id | name | parent_id
__________________________________________
1 | raw material | (null)
2 | work in progress | 1
3 | end product 1 | 2
4 | end product 2 | 2
ORDERSテーブルは次のようになります。
id | prod_id | order_date | delivery_date | delivered_date
どこ、
prod_id
id
PRODUCT_HIERARCHYテーブルを参照する外部キーです。
予測を保存するには? そのような要件に適した基本的なスキーマは何でしょうか?
26週間バケットの注文を選択するための私の考えは次のとおりです。
SELECT
COUNT(*) TOTAL_ORDERS,
WIDTH_BUCKET(
delivery_date,
SYSDATE,
ADD_MONTHS(sysdate, 6),
TO_NUMBER( TO_CHAR(SYSDATE,'DD-MON-YYYY') - TO_CHAR(ADD_MONTHS(sysdate, 6),'DD-MON-YYYY') ) / 7
) BUCKET_NO
FROM
orders_table
WHERE
delivery_date BETWEEN SYSDATE AND ADD_MONTHS(sysdate, 6);
しかし、これは、日に関係なく、今日から始まる毎週のバケットを提供します。Oracleでそれらを日曜日から土曜日の週に変換するにはどうすればよいですか?
このデータベース構造の設計にご協力ください。
(Oracle 11gを使用します)