Вот моя хранимая процедура:
CREATE DEFINER=`root`@`localhost` PROCEDURE `total_dr_cr`(yr varchar(64), effDate varchar(64))
BEGIN
DECLARE cursor_level INT;
DECLARE level_done INT DEFAULT FALSE;
DECLARE c_level CURSOR FOR SELECT glAccountLevelId FROM gl_accounts WHERE isDeleted = 0 GROUP BY glAccountLevelId ORDER BY glAccountLevelId DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET level_done = TRUE;
DROP TEMPORARY TABLE IF EXISTS temp_gl_account_totals;
CREATE TEMPORARY TABLE temp_gl_account_totals (glId int(11), level int(11), parentId int(11), glAccount varchar(255), title varchar(255), drAmount double(12,2), crAmount double(12,2));
INSERT INTO temp_gl_account_totals (glId, level, parentId, glAccount, title, drAmount, crAmount)
SELECT gl.id, gl.glAccountLevelId, gl.parentId, gl.account, gl.title, 0 as dr, 0 as cr
FROM gl_accounts gl
WHERE isDeleted = 0
GROUP BY gl.id;
OPEN c_level;
read_loop: LOOP
FETCH c_level INTO cursor_level;
IF level_done THEN
LEAVE read_loop;
END IF;
UPDATE temp_gl_account_totals totals
INNER JOIN (
SELECT
gl.id AS id,
gl.parentId,
gl.account,
gl.title,
(
IFNULL(SUM(led.drTotalAmount), 0)
+
(
SELECT IFNULL(SUM(drAmount), 0)
FROM temp_gl_account_totals gls
WHERE gls.parentId = gl.id
)
) AS dr,
(
IFNULL(SUM(led.crTotalAmount), 0)
+
(
SELECT IFNULL(SUM(crAmount), 0)
FROM temp_gl_account_totals gls
WHERE gls.parentId = gl.id
)
) AS cr
FROM gl_accounts gl
LEFT JOIN general_ledgers led ON led.glAccountId = gl.id AND led.isDeleted = 0 AND YEAR(led.effectiveDate) = yr AND IF(effDate <> '', DATE(led.effectiveDate), '') = effDate
WHERE gl.glAccountLevelId = cursor_level
AND gl.isDeleted = 0
GROUP BY gl.id
) x ON x.id = totals.glId
SET
totals.drAmount = x.dr,
totals.crAmount = x.cr
WHERE totals.level = cursor_level;
END LOOP;
SELECT * FROM temp_gl_account_totals;
CLOSE c_level;
END
Она возьмет общую сумму своего дочернего элемента и добавится к родительскому, чем выше уровень родительского элемента, тем выше сумма.
Только пример:
id | parentId | level | amount
1 | 0 | 1 | 100
2 | 1 | 2 | 50
3 | 2 | 3 | 50
4 | 1 | 2 | 50
5 | 4 | 3 | 50
- В id = 1 у нас есть 100, потому что мы суммируем его двух дочерних элементов, что составляет 50 + 50
- В id = 2 и id = 4 мы имеет 50, потому что мы суммируем его дочерний элемент, который равен 50
Часть, где я выбираю temp_gl_account_totals, является причиной ошибки:
Есть ли способ не использовать ту же таблицу, но создает такой же результат?
Спасибо!