0

私は2つのテーブルを持っています。

1 つのテーブルにはアイテムとそのコストが格納され、独自の GUID で一意に格納されます。

ItemCost テーブル

Item_ID     ItemCategory   Item    Cost

x-xx-x      Computer       Laptop  400.00

もう 1 つのテーブルには、これらのアイテムのコレクションであるワークスペースが格納されています。

ワークスペーステーブル

WorkSpace_ID    Workspace_Name   Item_Category_1     Item_Category_2 and so on....

xx-xx-xx         Workspace A     xx-xx-xx          (the guid from the first table) 

ここで、ItemCost テーブルのコストをワーク スペース テーブルで表す GUID に結合し、それらを列全体で合計して、ワーク スペースの総コストを算出する方法が必要です。Work Space テーブルの一部の Item_Category 列は null になります。

SQLではかなり新しいですが、ここでは一種の火による学習です。これを構造化するためのより良い方法があれば、提案をお待ちしています。

ありがとう。

4

2 に答える 2

2

あなたの問題のかなりの部分はWorkspaceテーブルの構造です。このテーブルは正規化されていません。

現在の設計では、結果を得るには、テーブルのピボットworkspaceを解除するか、テーブルに複数回結合する必要があります。

現在の構造クエリは次のようになります。

select *
from itemcost i
left join
(
  select workspace_id,
    worksapce_name,
    item_category_1 ItemCategory
  from workspace
  union all
  select workspace_id,
    worksapce_name,
    item_category_2
  from workspace
) w
  on i.Item_ID = w.ItemCategory

通常、呼び出されWorkspaceた場所にリンクするためのテーブルと個別のテーブルがあります。ItemCostWorkspaceworkspace_items

create table workspace
(
  workspace_id, 
  Workspace_Name
);

create table workspace_items
(
  workspace_id, 
  Item_ID
);

これにより、テーブルへの参加がはるかに簡単になります。この構造により、各ワークスペースに複数のアイテムカテゴリを割り当てることができます。テーブル構造を変更すると、クエリは次のようになります。

select *
from itemcost i
left join workspace_items wo
  on i.item_id = wi.item_id
left join workspace w
  on wi.workspace_id = w.workspace_id
于 2013-03-19T19:08:27.687 に答える
0

WorkSpacesとItemsの間に別の多対多のテーブルを作成する必要があります(そしてWorkspaceテーブルからItem列を削除します)。

WorkSpaceItemsテーブル:WorkSpace_ID-ItemID

次に、すべてのWorkSpaceItemをクエリし、それをItemsテーブルに結合して、合計するのは簡単です。

スキーマとサンプルクエリへのリンクは次のとおりです:http ://www.sqlfiddle.com/#!3/35336/7

于 2013-03-19T19:06:15.703 に答える