TSQL - SQL 2000 - PullRequest
       15

TSQL - SQL 2000

0 голосов
/ 17 февраля 2011

Я борюсь с этим. У меня есть таблица А, которая выглядит так:

<b>Employee_ID</B>      <b>Dependant_FirstName</b>     <b>DOB</b>
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 иждивенцев):

<b>Employee_ID</B>  <b>Dependant1_FirstName</b>  <b>DOB</b>        <b>Dependant2_FirstName</b> <b>DOB</b>         <b>Dependant3_FirstName</b>  <b>DOB</b>   
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

Большое спасибо за помощь.

Марк

Ответы [ 4 ]

3 голосов
/ 17 февраля 2011

Это рабочий пример только для ваших данных, чтобы дать представление о том, как я это сделаю.Я использую фальшивый зависимый счетчик, основанный на дате рождения и имени.Имейте в виду, что это сломается, если у сотрудника есть близнецы с тем же именем, но если они это сделают, то они заслуживают всей путаницы данных в течение всей жизни, которую они имеют в магазине:)

Также, пожалуйста, подумайтеобновить этот SQL Server.Или перенесите этот вид поворотов в инструмент отчетности, а не в базу данных.

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
1 голос
/ 17 февраля 2011

Проверьте этот код, пожалуйста, он может работать для вас.

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 Employee_ID=@Emp_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 @Count=@Count+1
    end
else
    begin
        exec('Update  tableB set  Dependant'+@count+'_FirstName='+@Name+' ,DOB'+@Count+'='+@DOB+'  where Employee_ID='+@Emp_Id)
        set @Count=@Count+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
1 голос
/ 17 февраля 2011

Вы можете

  • Создать представление
  • Рассчитать фиктивный рейтинг
  • Сгруппировать, чтобы найти максимальный рейтинг для каждого employee_ID
  • и вернутьрезультаты.

Примечание: в примерах я опустил столбец 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
0 голосов
/ 17 февраля 2011

Посмотрите на этот пример:

http://ryanfarley.com/blog/archive/2005/02/17/1712.aspx

здесь он объединяет дочерние элементы родительского ключа в строку, которая должна позволить вам записать плоскую запись.

...