Запрос на обновление с помощью агрегированного самосоединения

#sql #sql-update #aggregate #self-join

#sql #sql-обновление #агрегат #самосоединение

Вопрос:

Я использую самосоединение для получения итогов с начала года. Это работает:

 SELECT tc.EmployeeID, tc.TimeCardNum, tc.Tax, SUM(inr.Tax) AS YTDTax
FROM TimeCards tc
JOIN (
        SELECT EmployeeID, TimeCardNum, Tax
        FROM TimeCards  
) AS inr
ON inr.EmployeeID = tc.EmployeeID
AND inr.TimeCardNum <= tc.TimeCardNum
GROUP BY tc.EmployeeID, tc.TimeCardNum, tc.Tax
ORDER BY tc.EmployeeID, tc.TimeCardNum
  

который дает мне текущий итоговый столбец, который сбрасывается для каждого сотрудника.

Теперь я хочу превратить его в UPDATE запрос, чтобы поместить эти данные в новый столбец. Как это делается?

Ответ №1:

Вы пробовали:

 UPDATE a
SET a.YTDTax=b.YTDTax
FROM TimeCards a
INNER JOIN (
    SELECT tc.EmployeeID, tc.TimeCardNum, tc.Tax, SUM(inr.Tax) AS YTDTax
    FROM TimeCards tc
    JOIN (
            SELECT EmployeeID, TimeCardNum, Tax
            FROM TimeCards  
    ) AS inr
    ON inr.EmployeeID = tc.EmployeeID
    AND inr.TimeCardNum <= tc.TimeCardNum
    GROUP BY tc.EmployeeID, tc.TimeCardNum, tc.Tax
) b on a.EmployeeID=b.EmployeeID
AND a.TimeCardNum = b.TimeCardNum
  

Выполняется в транзакции, чтобы убедиться, что она выдает желаемый результат.

Комментарии:

1. Спасибо, что указали мне правильное направление. Каков здесь этикет? Должен ли я отредактировать ваш код, чтобы показать незначительные исправления, которые я использовал, чтобы он действительно заработал?

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

3. Есть идеи о том, как это сделать, не используя коррелированный подзапрос?