0

次のフィールドを持つ 2 つのテーブルがあります。

表1:

Date,       Month,   Dayname
2013-01-01, January, Tuesday

これは 2013 年 1 月 1 日から 2013 年 12 月 31 日までです。

表 2:

Workers_ID, Monday, Monday_Hours, Tuesday, Tuesday_Hours and so forth
1,          TRUE,        8,         TRUE,         8       ...
2,          False,       0,         FALSE,        4

私が必要とするのはテーブルです:

Date, Month, Dayname, Hours_to_work, Workers_ID

このテーブルにはNumber of workersxDays a year行があり、各行で特定の労働者が何時間働いているかがわかります。

私の問題、それを達成する方法がわかりません。誰かがそれを手伝ってくれたら最高です。

4

2 に答える 2

0

Ian P は、スキーマの修正に関して良いアドバイスを提供します。

現在のデザインに完全に行き詰まっている場合は、次の戦略を使用できます。

SELECT Date, Month, Dayname, Workers_ID,
  CASE Dayname
    WHEN 'Monday' THEN Monday_Hours
    WHEN 'Tuesday' Then Tuesday_Hours
   -- etc...
  END AS Hours_to_work
FROM Table_1 CROSS JOIN Table_2
于 2013-05-29T16:52:25.697 に答える
0

ここにはいくつかのことがありますが、それはすべて学習曲線の一部です! まず、MS SQL 内に Month に Dayname を提供し、DateName と DatePart を検索する関数があるため、まだ持っていない場合は、DateTime または smallDate 列の計算列にする必要があります。次に、Table_2 は理想的な設計ではありません。一般に、テーブルは狭く、インデックスは広くする必要があります。したがって、Table2 は WorkersID、Date、Hours の形式である必要があり、カバリング インデックス、または最悪の場合、Date、EmployeeID の複合クラスター化インデックスを持つことができます。これにより、(比較的) 簡単に、データに対して適切に実行されるクエリを生成できます。

構造を維持する場合、ピボットは役に立たないと思います。構造を維持する場合は、日付とemployeeIdに対するユニオンが必要だと思います。MS SQL には、範囲内の一連の値を生成する機能も含まれるようになりました (日付の連続した範囲) http://www.sqlperformance.com/2013/01/t-sql-queries/generate-a-set-1

于 2013-05-29T16:41:32.277 に答える