Maciej Los
Ну... Как Мика Венделиус[^] сказал, что вы должны переосмыслить структуру своей базы данных.
А пока взгляните на это решение:
DECLARE @tab1 TABLE(EmpID INT, casualLeaves INT, SickLeaves INT)
INSERT INTO @tab1 (EmpID, casualLeaves , SickLeaves)
VALUES(1, 3, 2)
DECLARE @tab2 TABLE(EmpID INT, LeavesBalance VARCHAR(50))
INSERT INTO @tab2 (EmpID, LeavesBalance)
VALUES(1, '1 CL,1 SL')
;WITH BalanceToLeaves AS
(
--initial value
SELECT EmpID, LEFT(LeavesBalance, CHARINDEX(',', LeavesBalance)-1) AS SingleLeave, RIGHT(LeavesBalance, LEN(LeavesBalance) -CHARINDEX(',', LeavesBalance)) AS Remainder
FROM @tab2
WHERE CHARINDEX(',', LeavesBalance)>0
--recursive part
UNION ALL
SELECT EmpID, LEFT(Remainder, CHARINDEX(',', Remainder)-1) AS SingleLeave, RIGHT(Remainder, LEN(Remainder) -CHARINDEX(',', Remainder)) AS Remainder
FROM BalanceToLeaves
WHERE CHARINDEX(',', Remainder)>0
UNION ALL
SELECT EmpID, Remainder AS SingleLeave, NULL AS Remainder
FROM BalanceToLeaves
WHERE CHARINDEX(',', Remainder)=0
)
UPDATE C SET C.casualLeaves = C.casualLeaves + B.CasualLeave,
C.SickLeaves = C.SickLeaves + B.SickLeave
FROM (
SELECT EmpID, SUM(CasualLeave) AS CasualLeave, SUM(SickLeave) AS SickLeave
FROM (
SELECT EmpID, SingleLeave, CASE WHEN SingleLeave LIKE '%CL' THEN CONVERT(INT, LEFT(SingleLeave, CHARINDEX(' ', SingleLeave)-1)) END AS CasualLeave,
CASE WHEN SingleLeave LIKE '%SL' THEN CONVERT(INT, LEFT(SingleLeave, CHARINDEX(' ', SingleLeave)-1)) END AS SickLeave
FROM BalanceToLeaves) AS A
GROUP BY EmpID ) AS B INNER JOIN @tab1 AS C ON B.EmpID = C.EmpID
После обновления
@tabl
содержит:
EmpID casualLeaves SickLeaves
1 4 3
Для получения более подробной информации, пожалуйста, смотрите:
С common_table_expression (Transact-SQL)[
^]
Использование Общих Табличных Выражений[
^]
Рекурсивные Запросы, Использующие Обобщенные Табличные Выражения[
^]
Обновление от SELECT с помощью SQL Server - переполнение стека[
^]
Maciej Los
Что ж... Есть ли какие-то проблемы с заменой [+
] с [-
] в UPDATE
заявление?
Пожалуйста, примите мой ответ как решение (зеленая кнопка) - формально, чтобы удалить ваш вопрос из списка без ответа.
Твое Здоровье, Мацей