2

さて私はこれを持っています-

Table DimDate- Date 
Table Employee-  Id,Name,Points,Date

これで、従業員テーブルには、来なかった場合を除いて毎日のポイントがあります...したがって、日付にはすべての日付エントリがありません...たとえば、1週間に2日間来なかった場合、従業員テーブルには5行しかありません。 ...だから私は2050年までのすべての日付を含むこのdimdateテーブルを持っており、これに参加して、彼がポイントを持っていない日付にゼロを追加します。だから私はこのクエリを書きましたが、機能しません-

Select E.EmployeeId,D.Date,isNull(E.Points,0) from DimDate D left join Employee E on D.Date between '01-01-2009'and '06-01-2009' where E.EmployeeId=1

上記のクエリは複数の日付を提供し、日付でgroup byを試しましたが、機能しません。

4

2 に答える 2

3

おそらく、日付範囲ではなく日付で2つのテーブルを結合したくないでしょう。次に、日付範囲でレコードセットをフィルタリングします。例

Select 
  E.EmployeeId,
  D.Date,
  isNull(E.Points,0)  
from DimDate D 
left join Employee E on D.Date = E.Date 
where E.EmployeeId=1 
  AND D.Date Between '01-01-2009'and '06-01-2009'

編集:

Select 
  E.EmployeeId,
  D.Date,
  isNull(E.Points,0)  
from DimDate D 
left join Employee E on D.Date = E.Date And E.EmployeeId=1
where D.Date Between '01-01-2009'and '06-01-2009'

また

Select 
  E.EmployeeId,
  D.Date,
  isNull(E.Points,0)  
from DimDate D 
left join Employee E on D.Date = E.Date 
where (E.EmployeeId = 1 OR E.EmployeeId is NULL) 
  AND D.Date Between '01-01-2009'and '06-01-2009'
于 2010-05-19T17:06:21.270 に答える
2

dimdatesテーブルと従業員が定義されているテーブルの間にクロス結合が必要だと思います。これにより、すべての従業員と日付の組み合わせを含むレコードのリストが表示されます。次に、その結​​果を、従業員ポイントレコードを持つテーブルに外部結合したままにする必要があります。

何かのようなもの:

Select CJ.EmployeeId,CJ.Date,isNull(E.Points,0) 
    from (SELECT EmployeeID, D.Date
          from DimDate D CROSS JOIN [EmployeeDefinitionTable] as edt) as CJ
        left outer join Employee E on CJ.Date =E.Date AND CJ.EmployeeId = E.EmployeeId
where CJ.Date between '01-01-2009'and '06-01-2009'
  and E.EmployeeId = 1

ここで、EmployeeDefinitionTableは、すべての従業員(または少なくともこの問題ステートメントのID)を一意にリストするテーブルです。

これにより、ポイントが入力されていない従業員もキャプチャされます。

必要に応じて、betweenステートメントやEmployeeIdフィルタリングをクロスジョインに移動できます。クロスジョインがより効率的になります。

于 2010-05-19T17:04:51.243 に答える