#sql-server #tsql #merge #sql-update
#sql-сервер #tsql #слияние #sql-обновление
Вопрос:
Я работаю с SQL Server, и мне нужно объединить несколько строк, только если они имеют одинаковое значение между ними в двух определенных столбцах (Col_01 и Col_02 в моем примере). Когда я объединяю их, я должен суммировать некоторые столбцы (Col_03 и Col_04 в моем примере).
Я думаю, что пример будет более наглядным. Вот моя упрощенная таблица :
| ID | Col_01 | Col_02 | Col_03 | Col_04 |
| 1 | ABC | DEF | 2 | 2 |
| 2 | ABC | DEF | 1 | 0 |
| 3 | DEF | GHI | 0 | 2 |
| 4 | ABC | GHI | 1 | 0 |
| 5 | JKL | GHI | 0 | 2 |
И вот что я хочу после моего обновления :
| ID | Col_01 | Col_02 | Col_03 | Col_04 |
| 2 | ABC | DEF | 3 | 2 |
| 3 | DEF | GHI | 0 | 2 |
| 4 | ABC | GHI | 1 | 0 |
| 5 | JKL | GHI | 0 | 2 |
Я объединил ID 1 и ID 2, потому что у них были одинаковые Col_01 и одинаковые Col_02.
Я попробовал такой запрос
SELECT MAX(ID), Col_01, Col_02, SUM(Col_03), SUM(Col_04)
FROM Table
GROUP BY Col_01, Col_02
У меня есть то, что объединили строки, но я теряю не объединенные.
Я не знаю, как правильно использовать это в UPDATE
запросе, чтобы объединить строки с одинаковыми (Col_01, Col_02) и сохранить остальные. Можете ли вы помочь мне сделать это?
Комментарии:
1. Вы можете использовать join для обновления. Кстати, какой идентификатор вам нужно обновить?
Ответ №1:
Итак, вам действительно нужно удалить некоторые строки из исходной таблицы. Для этого используйте MERGE
инструкцию:
MERGE Table tgt
USING (SELECT MAX(ID) as ID, Col_01, Col_02, SUM(Col_03) AS Col_03, SUM(Col_04) AS Col_04
FROM Table
GROUP BY Col_01, Col_02) src ON tgt.ID = srs.ID
WHEN MATCHED THEN
UPDATE
SET Col_03 = src.Col_03, Col_04 = src.Col_04
WHEN NOT MATCHED BY SOURCE THEN
DELETE
Ответ №2:
Попробуйте это:
UPDATE T SET
T.Col_03 = G.Col_03,
T.Col_04 = G.Col_04
FROM Table AS T INNER JOIN
(SELECT MAX(ID) AS ID, Col_01, Col_02, SUM(Col_03) AS Col_03, SUM(Col_04) AS Col_04
FROM Table
GROUP BY Col_01, Col_02) AS G
ON G.ID = T.ID