【问题标题】:How to merge two row and sum some columns in an UPDATE?如何在 UPDATE 中合并两行并对某些列求和?
【发布时间】:2014-07-02 12:23:23
【问题描述】:

我使用 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) 的行并保留其他行。你能帮我做这件事吗?

【问题讨论】:

  • 可以使用join来更新。顺便说一句,您需要更新哪个 ID?

标签: sql-server tsql merge sql-update


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 2016-08-17
      • 2018-08-13
      相关资源
      最近更新 更多