3

列を持つEmployeesテーブルがありますID, PostID, StartDate, EndDate

サンプルデータ

ID   PostID  StartDate   EndDate
----------------------------------------
1    1       2005/15/08   null      <---Null is still employed
2    2       2006/02/04  2006/08/06
3    1       2004/03/07  9999/12/31 <--- Can also be still Employed
4    2       2008/04/01   null

正しい結果は

Year Post Total
2004 1    1
2005 1    2
2006 1    2
2006 2    1
2007 1    2
2007 2    0
2008 1    2
2008 2    1

2007 年EmployeeID = 2 PostID = 2に終了したことに注意してください ( Endate = 2006/08/06)

特定の PostID の合計を返したい

使った

SUM(CASE WHEN PostID=1 THEN 1 ELSE 0 END) HPMP, 
  SUM(CASE WHEN PostID=4 THEN 1 ELSE 0 END) HPN,  
  SUM(CASE WHEN PostID=6 THEN 1 ELSE 0 END) HPMW

特定の投稿を取得する

問題は、これを 1990 年から 2012 年までの YEAR ごとにグループ化する必要があることです。

重要: SQL Server CE を使用しており、スクリプトまたはストアド プロシージャを使用できません。

select grouped by ステートメントである必要があります。

4

1 に答える 1

1

最初に、年表が必要になります。一部の DBMS には、これらをオンザフライで作成する方法があります。年列を持つ年テーブルと、年ごとに 1 つの行を想定すると、次のように動作するはずです。

Select
  y.Year,
  e.PostID,
  Count(*) As Total
From
  Years y
    Inner Join
  Employees e
    On y.Year >= Year(e.StartDate) And (y.Year <= Year(e.EndDate) Or e.EndDate Is Null)
Group By
  y.Year,
  e.PostID
Order By
  1, 2

where 句を追加して、年の範囲を制限できます。例: y.Year >= Year(GetDate()) - 5 And y.Year <= Year(GetDate())

ゼロも含めたい場合:

Select
    y.Year,
    p.PostID,
    Count(e.ID) As Total
From
    Years y
        Cross Join
    (Select Distinct PostID From Employees) p
        Left Outer Join
    Employees e
        On 
            y.Year >= Year(e.StartDate) And 
            (y.Year <= Year(e.EndDate) Or e.EndDate Is Null) And
            p.PostID = e.PostID
Group By
    y.Year,
    p.PostID
Order By
    1, 2

Posts テーブルがある場合は、個別選択ビットの代わりにこれを使用します。

于 2012-10-31T10:44:53.847 に答える