Есть таблица, в которой дублируются REF_DOC_ID.
REF_DOC_ID ARTICLE_ID Amount
1 1 10
2 1 10
2 2 10
3 2 10
Надо ее обновить к виду
REF_DOC_ID ARTICLE_ID Amount
1 1 10
2 2 20
3 2 10
То есть нужна группировка по REF_DOC и суммирование по Amount. Article_ID в любой сгруппированной строке должен быть 2. Помогите, пожалуйста, составить UPDATE. Пробовала много вариантов, не удается. Вот один из них
UPDATE `Test100` t1, (SELECT `REF_DOC_ID`, MIN(`ARTICLE_ID`) as
`Min`, SUM(`Amount`) as `Sum` FROM `Test100` GROUP BY `REF_DOC_ID`)
as `t2` CASE WHEN `t1`.`REF_DOC_ID` IN (SELECT REF_DOC_ID FROM
(SELECT REF_DOC_ID, COUNT(*) as `num` FROM Test100 GROUP BY
REF_DOC_ID) z WHERE `num`= 2) THEN DELETE FROM t1
WHERE t1.`REF_DOC_ID`= z.`REF_DOC_ID` AND z.`num` = 2
AND t1.`ARTICLE_ID`= t2.`MIN` END
SET t1.`REF_DOC_ID` = t2.`REF_DOC_ID`, t1.`ARTICLE_ID`=t2.`MAX`,
t1.`Amount` = t2.`SUM`
Для решения озвученной задачи UPDATE неприменим. Причина - кроме обновления части записей, требуется удаление остальных записей. Потому решение должно состоять минимум из 2 запросов.
Но самое простое (имхо) решение состоит из 3 запросов:
CREATE /* TEMPORARY */ TABLE temp (ref_doc_id INT
, article_id INT
, amount INT)
SELECT ref_doc_id
, CASE COUNT(article_id) WHEN 1 THEN MAX(article_id) ELSE 2 END
, SUM(amount)
FROM Test100
GROUP BY ref_doc_id;
TRUNCATE Test100;
INSERT INTO Test100 (ref_doc_id, article_id, amount)
SELECT ref_doc_id, article_id, amount
FROM temp;
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники