#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. Есть идеи о том, как это сделать, не используя коррелированный подзапрос?