2016-09-12 9 views
-2

現在、私は解決策を探しています。英語は私の母国語ではないので、少し分かりやすくするために2枚の写真を追加しました。私のSQLの知識はむしろ基本的なものです。SQL難しい文

TableDatabase

椅子(最終生成物)は、いくつかの成分を含有します。
各コンポーネントにはアイテム番号が含まれていますが、各スペアセットには複数のアイテム番号が含まれています。
データベースでは、スペアセットは最終製品と同じテーブルにあります。
椅子と予備品は、異なるグループに分類されています。

このような表を作成することはできますか?それが可能ならどのように?

ありがとうございます!

+0

学校の割り当て?何を試しましたか? – jarlh

+0

1つのテーブルを使用するのがこの問題を解決する最善の方法ではないかもしれません。あなたは間違いなくお互いに関連している複数のテーブルが必要になります。 – Fleuv

+0

@jarlh、それはインターンシップのためです。私は2つのテーブルを組み合わせることはできません。 – Jur

答えて

1

これは私のアプローチは次のようになります。

Table: Products -- a table of products 
ProductID ProductName DateAdded 
1   Chair X  01/01/2016 
2   Chair Y  05/05/2016 
3   Spare Set A 06/06/2016 
... 

Table: Components -- a table of components 
ComponentID ComponentName ItemNumber DateAdded 
1   Backrest  X01   01/01/2016 
2   Headrest  X02   01/01/2016 
... 

Table: ProductComponent -- a lookup/mapping table to link Product and Component 
PCID ComponentID ProductID DateAdded 
1  1   1   01/01/2016 
2  2   1   01/01/2016 
... 

DateAddedは、製品またはコンポーネントが最初にデータベースに入力された日付です。これは監査目的のためのものです。

0

以下のクエリは標準SQLを使用してこのようなピボットを生成します。
また、MySQLで動作する必要があります。

これはJohnHCの回答の表レイアウトに基づいています。
(とにかくそのようなことをするでしょう。マッピングテーブルを使用すると、共通の非正規化方式である。)

select c.ComponentName 
,max(case when p.ProductName = 'Chair X' then 'x' else ' ' end) as Chair_X 
,max(case when p.ProductName = 'Chair Y' then 'x' else ' ' end) as Chair_Y 
,max(case when p.ProductName = 'Chair Z' then 'x' else ' ' end) as Chair_Z 
,max(case when p.ProductName = 'Spare Set A' then 'x' else ' ' end) as Spare_set_A 
,max(case when p.ProductName = 'Spare Set B' then 'x' else ' ' end) as Spare_set_B 
,max(case when p.ProductName = 'Spare Set C' then 'x' else ' ' end) as Spare_set_C 
from ProductComponent pc 
inner join Products p on (pc.ProductID = p.ProductID) 
left join Components c on (pc.ComponentID = c.ComponentID) 
where (p.ProductName like 'Chair %' or p.ProductName like 'Spare Set %') 
group by c.ComponentName 
order by c.ComponentName;