使用GROUPBY进行SQL合并

使用GROUPBY进行SQL合并,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我必须执行一个MERGE语句,但是在我需要准备查询之前,这个查询有一个groupby,其中包含一些字符串列和值,因为我正在执行一个groupby,我不能包含主键。如果无法提供主键,如何进行合并 这就是问题所在 SELECT Account, BillDate, Name, SUM(ChargeAmount) AS ChargeAmount, SUM(ChargeTaxes) AS ChargeTaxes, FROM M

我必须执行一个
MERGE
语句,但是在我需要准备查询之前,这个查询有一个
groupby
,其中包含一些字符串列和值,因为我正在执行一个groupby,我不能包含主键。如果无法提供主键,如何进行
合并

这就是问题所在

SELECT Account,
       BillDate, 
       Name,
       SUM(ChargeAmount) AS ChargeAmount, 
       SUM(ChargeTaxes) AS ChargeTaxes,       
  FROM MyTempTable
 GROUP BY Account, BillDate, Name

现在,我需要从该查询开始将
合并到我的表中,但我没有pk。

您可以使用
GROUP BY
子句和。根据文件规定:

[ WITH <common_table_expression> [,...n] ]
MERGE 
    [ TOP ( expression ) [ PERCENT ] ] 
    [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]
    USING <table_source> 
    ON <merge_search_condition>
    [ WHEN MATCHED [ AND <clause_search_condition> ]
        THEN <merge_matched> ] [...n ]
    [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
        THEN <merge_not_matched> ]
    [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
        THEN <merge_matched> ] [...n ]
    [ <output_clause> ]
    [ OPTION ( <query_hint> [ ,...n ] ) ]    
;
因此,您可以将
分组依据
子句,如您在问题中所做的那样:

MERGE INTO table2 AS TGT
USING
(
  SELECT Account,
       BillDate, 
       Name,
       SUM(ChargeAmount) AS ChargeAmount, 
       SUM(ChargeTaxes) AS ChargeTaxes
  FROM table1
 GROUP BY Account, BillDate, Name
) AS SRC
  ON  SRC.Account = TGT.Account AND
      SRC.Name = TGT.Name
WHEN NOT MATCHED THEN
  INSERT (Account, BillDate, Name, ChargeAmount, ChargeTaxes)
  VALUES (SRC.Account, SRC.BillDate, 
          SRC.Name, SRC.ChargeAmount, SRC.ChargeTaxes);

向我们展示您已有的查询,以及一些示例数据和所需的输出。
merge
语句本身并不需要主键。您可以对根本没有键的表使用
merge
。如果没有代码,我们无法知道您的具体问题是什么。另外,用英语描述代码试图执行的操作也会有所帮助。
MERGE INTO table2 AS TGT
USING
(
  SELECT Account,
       BillDate, 
       Name,
       SUM(ChargeAmount) AS ChargeAmount, 
       SUM(ChargeTaxes) AS ChargeTaxes
  FROM table1
 GROUP BY Account, BillDate, Name
) AS SRC
  ON  SRC.Account = TGT.Account AND
      SRC.Name = TGT.Name
WHEN NOT MATCHED THEN
  INSERT (Account, BillDate, Name, ChargeAmount, ChargeTaxes)
  VALUES (SRC.Account, SRC.BillDate, 
          SRC.Name, SRC.ChargeAmount, SRC.ChargeTaxes);