sql - 如何使用Group By子句合并两个sql server表?

标签 sql sql-server sql-server-2005 group-by

我有两个表TableA和TableB,如下所示:

表A:

     ItemID          Qty           Rate
    --------        -----         --------
       1             10            100.00
       2             20            150.00

表B:

     ItemID          Qty           Rate
    --------        -----         -------
       1              5            150.00
       3              10           200.00
       3              20           400.00

现在我想合并这两个表。我想要的结果需要如下:

结果表A:

     ItemID           Qty           Rate
    --------         -----         -------
       1              15            150.00
       2              20            150.00
       3              30            400.00

我尝试了以下 Insert Select 语句,但它没有给出所需的结果。

INSERT INTO TableA
(
     ItemID,
     Qty,
     Rate               
)
SELECT 
    ItemID, 
    SUM(Qty), 
    MAX(Rate)
FROM 
    TableB
GROUP BY 
    ItemID

但它给出的结果如下:

     ItemID          Qty           Rate
    --------        -----         --------
       1             10            100.00
       2             20            150.00
       1              5            150.00
       3              30           400.00

如何达到我想要的结果?

我尝试过这样的:

 MERGE PUR_PODetail AS Target
                USING (
                    SELECT 
                        @POID,
                        ItemID,
                        SUM(POQuantity),
                        MAX(UnitRate),
                        1,
                        CASE WHEN D1 = '' THEN NULL ELSE D1 END D1,
                        CASE WHEN D2 = '' THEN NULL ELSE D2 END D2,
                        CASE WHEN D3 = '' THEN NULL ELSE D3 END D3,
                        CASE WHEN RandomDimension = '' THEN NULL ELSE RandomDimension END RandomDimension,
                        0
                    FROM 
                        @Detail
                    GROUP BY 
                        ItemID, D1, D2, D3, RandomDimension
                    ) AS Source  ON (Target.ItemID = Source.ItemID) AND 
                    (ISNULL(Target.D1, -999) = ISNULL(Source.D1, -999)) AND 
                    (ISNULL(Target.D2, -999) = ISNULL(Source.D2, -999)) AND 
                    (ISNULL(Target.D3, -999) = ISNULL(Source.D3, -999)) AND
                    (ISNULL(Target.RandomDimension, -999) = ISNULL(Source.RandomDimension, -999))
                WHEN MATCHED
                    THEN UPDATE SET 
                            Target.POQuantity = Target.POQuantity + Source.POQuantity,
                            Target.UnitRate = MAX(Source.UnitRate)
                WHEN NOT MATCHED
                    INSERT
                        (
                            POID,
                            ItemID,
                            POQuantity,
                            UnitRate,
                            ItemStatusID,
                            D1,
                            D2,
                            D3,
                            RandomDimension,
                            EDInclusive_f
                        )
                    VALUES
                        (
                            @POID, 
                            Source.ItemID, 
                            Source.POQuantity, 
                            Source.UnitRate, 
                            1,
                            CASE WHEN Source.D1 = '' THEN NULL ELSE Source.D1 END D1,
                            CASE WHEN Source.D2 = '' THEN NULL ELSE Source.D2 END D2,
                            CASE WHEN Source.D3 = '' THEN NULL ELSE Source.D3 END D3,
                            CASE WHEN Source.RandomDimension = '' THEN NULL ELSE Source.RandomDimension END RandomDimension,
                            0
                        )

但它给出了以下错误。 请更正错误。我不知道这里会出现什么问题。

消息 102,级别 15,状态 1,过程 PUR_PurchaseOrder_IU,第 936 行 “MERGE”附近的语法不正确。 消息 156,级别 15,状态 1,过程 PUR_PurchaseOrder_IU,第 953 行 关键字“AS”附近的语法不正确。

但是当我从存储过程中删除这些合并语句时,它正在执行...

最佳答案

您不能仅使用 INSERT 语句来执行此操作,您必须使用 INSERTUPDATE,具体取决于已存在的 ItemID在您的目标表中。

SQL Server 2005

UPDATE  @TableA
SET     Qty = a.Qty + b.Qty
        , Rate = CASE WHEN a.Rate < b.Rate
                      THEN b.Rate 
                      ELSE a.Rate 
                  END
FROM    @TableA a
        INNER JOIN (
          SELECT  ItemID
                  , Qty = SUM(Qty)
                  , Rate = MAX(Rate)
          FROM    @TableB
          GROUP BY 
                  ItemID  
        ) b ON a.ItemID = b.ItemID

INSERT INTO @TableA
SELECT  ItemID, Qty, Rate
FROM    ( SELECT  ItemID
                  , Qty = SUM(Qty)
                  , Rate = MAX(Rate)
          FROM    @TableB b
          WHERE   NOT EXISTS (SELECT * FROM @TableA a WHERE a.ItemID = b.ItemID)
          GROUP BY 
                  ItemID  
        ) b

SQL Server 2008 提供 MERGE对此的声明。

Performs insert, update, or delete operations on a target table based on the results of a join with a source table. For example, you can synchronize two tables by inserting, updating, or deleting rows in one table based on differences found in the other table.

SQL Server 2008

MERGE @TableA AS Target
USING (
  SELECT  ItemID
          , Qty = SUM(Qty)
          , Rate = MAX(Rate)
  FROM    @TableB
  GROUP BY 
          ItemID  
) AS source (ItemID, Qty, Rate) ON (target.ItemID = source.ItemID)
WHEN MATCHED THEN 
  UPDATE SET target.Qty = target.Qty + source.Qty
             , target.Rate = CASE WHEN target.Rate < source.Rate 
                                  THEN source.Rate 
                                  ELSE target.Rate 
                             END
WHEN NOT MATCHED THEN
  INSERT (ItemID, Qty, Rate)
  VALUES (source.ItemID, source.Qty, source.Rate);

关于sql - 如何使用Group By子句合并两个sql server表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8754564/

相关文章:

sql - OPENROWSET - 如何以文本形式阅读所有内容?

sql - 获取多个分区的潜在客户值(value)

mysql - SQL Server 2005 32 位 - 错误 : The OLE DB provider "OLEDB.1" for linked server "(null)" reported an error. 提供程序内存不足

mysql - 如何计算MySQL中每个组的运行总和

java - 如何为给定查询编写JPA CriteriaBuilder?

sql - 在 SQL Server 实例中存储数据库的多个版本的最合乎逻辑的方法是什么?

sql - T-SQL : An error occurred while executing batch. 错误消息是:从 MyTable 中选择 * 的算术溢出

c# - 运行 C# .NET Winform 应用程序,该应用程序使用 SQL Server 作为数据库,仅将 .mdf 文件放置在用户 PC 上

sql - 创建与 SQL Server 的所有可能组合

mysql - 在 google bigquery 中选择内部案例语句