0

私は次のような表、従業員の履歴を持っています

ID | Current_Dept | Dept_Start_Date | Name
1 | Sales | 2012-01-01 | John Smith
1 | Marketing | 2010-01-01 | John Smith
1 | Intern | 2008-01-01 | John Smith
2 | IT | 2012-01-01 | Sue Jones
2 | Sales | 2011-01-01 | Sue Jones
2 | eBusiness | 2010-10-01 | Sue Jones
3 | Warehouse | 2012-01-01 | Bobby Ray
3 | Sales | 2009-01-01 | Bobby Ray

私が欲しいのは、これまで営業で働いたことのあるすべての人に与える質問です。

ID | DeptBefore | DeptAfter | CurrentDept
1  | Marketing  |           | Sales
2  | ebusiness  | IT        | IT
3  |            | Warehouse | Warehouse

現時点では、これを他の方法で実行し、各行のテーブルを再帰的にクエリする簡単な方法はありません。

1日に1回入力される「一時」テーブルを作成し、そこからクエリを実行したいと思います。

SQL ServerとC#(ASP.NET)を使用しているのは、これらが他のより単純なソリューションを提供する場合に備えてです。

すべてが理にかなっていることを願っています。

ありがとう、

4

2 に答える 2

1

CTEを使用すると役立ちます。

DECLARE @Temp TABLE
(
    ID INT,
    current_dept NVARCHAR(100),
    Dept_Start_Date DATETIME,
    Name NVARCHAR(100)
)

INSERT INTO @Temp
(ID, current_dept, Dept_Start_Date, Name)
VALUES
(1, 'Sales', '2012-01-01', 'John Smith'), 
(1, 'Marketing', '2010-01-01', 'John Smith'), 
(1, 'Intern', '2008-01-01', 'John Smith'),
(2, 'IT', '2012-01-01', 'Sue Jones'), 
(2, 'Sales', '2011-01-01', 'Sue Jones'), 
(2, 'eBusiness', '2010-01-01', 'Sue Jones'),
(3, 'Warehouse', '2012-01-01', 'Bobby Ray'),
(3, 'Sales', '2009-01-01', 'Bobby Ray')

DECLARE @current_dept NVARCHAR(100) = 'Sales'
;WITH CurrentDeptCTE AS 
(
    SELECT ID, current_dept, Dept_Start_Date, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Dept_Start_Date DESC) AS SEQUENCE
    FROM @Temp
)
SELECT SalesDept.ID, DeptBefore.current_dept AS 'DeptBefore', DeptAfter.current_dept     AS 'DeptAfter', CurrentDept.current_dept AS 'CurrentDept'
FROM
(
    SELECT ID, SEQUENCE
    FROM CurrentDeptCTE
    WHERE current_dept = @current_dept
) SalesDept
LEFT JOIN CurrentDeptCTE AS DeptBefore ON SalesDept.ID = DeptBefore.ID AND            SalesDept.SEQUENCE = DeptBefore.SEQUENCE - 1
LEFT JOIN CurrentDeptCTE AS DeptAfter ON SalesDept.ID = DeptAfter.ID AND SalesDept.SEQUENCE = DeptAfter.SEQUENCE + 1
LEFT JOIN 
(
    SELECT ID, current_dept
    FROM CurrentDeptCTE 
    WHERE SEQUENCE = 1
) CurrentDept ON SalesDept.ID = CurrentDept.ID
于 2012-08-13T10:15:48.727 に答える
1

データから、営業部門の前後の部門が必要であるように見えます。immediately例えば; ジョン・スミスがインターンとして始めたことを示すものではありません。

注:誰かが2つの異なる機会に販売のために働いた場合、あなたはあなたが望む結果を検討したいかもしれません。

WITH
  sequenced AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY dept_start_date DESC) AS sequence_id
  FROM
    yourTable
)
SELECT
  salesRecord.id,
  prevRecord.current_dept     AS DeptBefore,
  nextRecord.current_dept     AS DeptAfter,
  lastRecord.current_dept     AS DeptCurrent
FROM
  sequenced     AS salesRecord
LEFT JOIN
  sequenced     AS prevRecord
    ON  prevRecord.id          = salesRecord.id
    AND prevRecord.sequence_id = salesRecord.sequence_id - 1
LEFT JOIN
  sequenced     AS nextRecord
    ON  nextRecord.id          = salesRecord.id
    AND nextRecord.sequence_id = salesRecord.sequence_id + 1
LEFT JOIN
  sequenced     AS lastRecord
    ON  lastRecord.id          = salesRecord.id
    AND lastRecord.sequence_id = 1
WHERE
  salesRecord.CurrentDept = 'Sales'

アイテムを降順で並べ替えると、現在のレコードは常にになりsequence_id = 1ます。

于 2012-08-13T09:04:34.730 に答える