SQL запрос UPDATE с группировкой

225
18 мая 2017, 10:24

Есть таблица, в которой дублируются 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` 
Answer 1

Для решения озвученной задачи 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;
READ ALSO
Как выбрать систему хранения данных innodb?

Как выбрать систему хранения данных innodb?

На одном хостинге, при создании таблиц в базе данных, по умолчанию создаются таблицы myisamИ дело в том, что это нигде нельзя выбрать, чтобы по умолчанию...

197
Как включить отзывы для товаров Woocommerce через MySql

Как включить отзывы для товаров Woocommerce через MySql

В карточке товара Woocommerce на вкладке "Дополнительно" есть возможность включить отзывы, отметив соответствующий чекбокс

291
Растяжение текста в TextView, Android Studio

Растяжение текста в TextView, Android Studio

Привет, не могу придумать как сделать растяжение текста на всю ширину экрана в TextView, в конце строки всегда остаются большие пробелыНадо сделать...

854
Программная установка цвета на кнопку

Программная установка цвета на кнопку

Приложение падает когда пытаюсь программно установить цвет фона кнопкиКнопку инициализировал в Java, всё связал

231