2011-02-17 19 views
0

私はこの問題に苦しんでいます。TSQL - SQL 2000

 
Employee_ID  Dependant_FirstName  DOB 
1    John     12/12/1980 
1    Lisa     11/11/1982 
2    Mark     06/06/1985 
2    Shane     07/07/1982 
2    Mike     03/04/1990 
3    NULL     NULL 

と、次のように表Bにこれらのデータをコピーしたいと思います(のみ表Aで6つの扶養の最大があるかもしれないことを知っている):

 
Employee_IDDependant1_FirstNameDOB  Dependant2_FirstNameDOB   Dependant3_FirstNameDOB 
1   John     12/12/1980 Lisa     11/11/1982 NULL     NULL 
2   Mark     06/06/1985 Shane    07/07/1982 Mike     03/04/1990 
3   NULL     NULL  NULL     NULL  NULL     NULL 
私はこのようになりますどのテーブルを持っています

ご協力いただきありがとうございます。

マルク・

+1

マークがシェーンの前にいて、シェーンがマイクの前にいる理由がありますか? –

+0

これは一度だけのことですか?テーブルAに列を追加できますか?テーブルAに従業員ごとに1-nからのDependant_Counterフィールドがある場合、これはかなり時間がかかります。 –

答えて

1

あなたは

  • はそれぞれの最大ランキングは
  • リターン結果EMPLOYEE_ID見つけることfictuousランキング
  • グループを計算して表示
  • を作成することができます。

注:私は例でDOB列を省略されている

声明

CREATE VIEW dbo.VIEW_Employees_Ranking AS 
    SELECT Ranking = ISNULL(e6.Employee_ID, 0) 
      + ISNULL(e5.Employee_ID, 0) 
      + ISNULL(e4.Employee_ID, 0) 
      + ISNULL(e3.Employee_ID, 0) 
      + ISNULL(e2.Employee_ID, 0) 
      + ISNULL(e1.Employee_ID, 0)   
      , e1.Employee_ID 
      , Name1 = e1.Dependant_FirstName 
      , Name2 = e2.Dependant_FirstName 
      , Name3 = e3.Dependant_FirstName 
      , Name4 = e4.Dependant_FirstName 
      , Name5 = e5.Dependant_FirstName 
      , Name6 = e6.Dependant_FirstName 
    FROM dbo.Employees e1 
      LEFT OUTER JOIN dbo.Employees e2 ON e2.Employee_ID = e1.Employee_ID AND e2.DOB > e1.DOB 
      LEFT OUTER JOIN dbo.Employees e3 ON e3.Employee_ID = e2.Employee_ID AND e3.DOB > e2.DOB 
      LEFT OUTER JOIN dbo.Employees e4 ON e4.Employee_ID = e3.Employee_ID AND e4.DOB > e3.DOB 
      LEFT OUTER JOIN dbo.Employees e5 ON e5.Employee_ID = e4.Employee_ID AND e5.DOB > e4.DOB 
      LEFT OUTER JOIN dbo.Employees e6 ON e6.Employee_ID = e5.Employee_ID AND e6.DOB > e5.DOB 
GO 

SELECT er.* 
FROM dbo.VIEW_Employees_Ranking er 
     INNER JOIN (
      SELECT Ranking = MAX(Ranking) 
        , Employee_ID 
      FROM dbo.VIEW_Employees_Ranking 
      GROUP BY 
        Employee_ID 
     ) ermax ON ermax.Ranking = er.Ranking AND ermax.Employee_ID = er.Employee_ID 
3

これは方法のアイデアを与えるために、ちょうどあなたの例のデータのための実施例であります私はそれをやるだろう。私は生年月日と名前に基づいて偽装された依存カウンタを使用しています。従業員が同じ名前の双子を持っている場合は壊れてしまうことに注意してください。しかし、そうした場合、生涯にわたるデータの混乱は避けられません。

また、 SQLサーバー。または、この種のピボット操作を、データベースではなくレポートツールに移動します。

CREATE TABLE #employees (employee_id INTEGER, Dependant_FirstName VARCHAR(20), DOB DATETIME) 

INSERT INTO #employees VALUES (1,    'John',     '12/12/1980') 
INSERT INTO #employees VALUES (1,    'Lisa',     '11/11/1982') 
INSERT INTO #employees VALUES (2,    'Shane',     '07/07/1982') 
INSERT INTO #employees VALUES (2,    'Mark',     '06/06/1985') 
INSERT INTO #employees VALUES (2,    'Mike',     '03/04/1990') 
INSERT INTO #employees VALUES (3,    NULL,     NULL) 

SELECT 
    employee_id, 
    MAX(CASE WHEN dep_count = 1 THEN Dependant_FirstName ELSE NULL END) 'Dependant1_FirstName', 
    MAX(CASE WHEN dep_count = 1 THEN DOB ELSE NULL END) 'Dependant1_DOB', 
    MAX(CASE WHEN dep_count = 2 THEN Dependant_FirstName ELSE NULL END) 'Dependant2_FirstName', 
    MAX(CASE WHEN dep_count = 2 THEN DOB ELSE NULL END) 'Dependant2_DOB', 
    MAX(CASE WHEN dep_count = 3 THEN Dependant_FirstName ELSE NULL END) 'Dependant3_FirstName', 
    MAX(CASE WHEN dep_count = 3 THEN DOB ELSE NULL END) 'Dependant3_DOB' 
FROM 
    (
     SELECT 
      employee_id, 
      Dependant_FirstName, 
      DOB, 
      (
       SELECT 
        COUNT(*) 
       FROM 
        #employees deps 
       WHERE 
        #employees.employee_id = deps.employee_id AND 
        CONVERT(VARCHAR, #employees.DOB, 126) + #employees.Dependant_FirstName <= 
         CONVERT(VARCHAR, deps.DOB, 126) + deps.Dependant_FirstName 
      ) 'dep_count' 
     FROM 
      #employees 
    ) add_dep_count_query 
GROUP BY 
    employee_id 
+0

+1データ混乱の冗談を言って、これは報告ツールによってより良くなると言う事実を述べています。 –

+0

+1デッドエンドのSQL Server 2000からのアップグレードのアドバイス..... –

+0

公正であるように、多くの人が同じ理由で多くの人がSQL Server 2000を使用しなければならない彼らが本社のIT部門であろうと、彼らがサポートしなければならない有料の顧客であろうと、ほとんど影響を及ぼさない誰かが彼らのために決定を下したからです。しばしば私がこれらのことを言うとき、私は悲しげに変換した人に説教していることを知っています... –

1

このコードをチェックしてください、あなたのために役立つかもしれません。

declare @Emp_Id int 
declare @Name int 
declare @DOB int 
declare @Count int 
set @Count=1 
DECLARE x_cursor CURSOR FOR 
SELECT distinct Employee_ID from tableA 
OPEN x_cursor 
FETCH NEXT FROM x_cursor 
INTO @Emp_Id 
WHILE @@FETCH_STATUS = 0 
BEGIN 


DECLARE second_cursor CURSOR FOR 
SELECT distinct Dependant_FirstName,DOB from tableA 
where [email protected]_Id 
OPEN second_cursor 
FETCH NEXT FROM second_cursor 
INTO @Name,@DOB 

WHILE @@FETCH_STATUS = 0 
BEGIN 


if(@Count=1) 
    begin 
     insert into tableB (Employee_ID , Dependant1_FirstName,DOB) 
     values(@Emp_Id,@Name,@DOB) 
     set @[email protected]+1 
    end 
else 
    begin 
     exec('Update tableB set Dependant'[email protected]+'_FirstName='[email protected]+' ,DOB'[email protected]+'='[email protected]+' where Employee_ID='[email protected]_Id) 
     set @[email protected]+1 
    end 

    FETCH NEXT FROM second_cursor 
    INTO @Name,@DOB 
END 
CLOSE second_cursor 
DEALLOCATE second_cursor 


set @Count=1 
    FETCH NEXT FROM x_cursor 
    INTO @Emp_Id 

END 
CLOSE x_cursor; 
DEALLOCATE x_cursor 
GO