Как объединить две строки и суммировать некоторые столбцы в ОБНОВЛЕНИИ?

#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