Sql server SQL Server:在列上使用sum()和group by更新列

Sql server SQL Server:在列上使用sum()和group by更新列,sql-server,tsql,Sql Server,Tsql,我正在尝试更新SQL Server表,其中我的estimatename、region、marketname、b_date、len、creative、file_id相同,并将支出列相加,使其成为单行 例如: mdl\U drtv\U部件\U b\U主id: ESTIMATE NAME REGION MARKET NAME BCAST DATE LEN CREATIVE SPEND file_id create_date 451 4Q18 EAST CENTRAL EC PI

我正在尝试更新SQL Server表,其中我的estimatename、region、marketname、b_date、len、creative、file_id相同,并将支出列相加,使其成为单行

例如:

mdl\U drtv\U部件\U b\U主id

ESTIMATE NAME   REGION  MARKET NAME BCAST DATE  LEN CREATIVE    SPEND   file_id create_date
451 4Q18 EAST CENTRAL   EC  PIT PA  2018-11-15  60  GET MORE - HYBRID   410.00  5862    2019-04-05 16:17:14.453
452 4Q18 EAST CENTRAL   EC  PIT PA  2018-11-15  60  Get More - Hybrid   350.00  5862    2019-04-05 16:17:14.453
1929    4Q18 EAST CENTRAL   EC  PIT PA  2018-11-15  60  GET MORE - HYBRID   646.00  5863    2019-04-05 16:18:51.490
我想将此作为我的输出:

ESTIMATE NAME   REGION  MARKET NAME BCAST DATE  LEN CREATIVE            SPEND   file_ID create_date
4Q18 EAST CENTRAL   EC  PIT PA  2018-11-15  60  GET MORE - HYBRID   760.00  5862    2019-04-05 16:17:14.453
4Q18 EAST CENTRAL   EC  PIT PA  2018-11-15  60  GET MORE - HYBRID   646.00  5863    2019-04-05 16:18:51.490
以下是获取输出结果的SQL选择:

SELECT 
    [ESTIMATE NAME], [REGION], [MARKET NAME], [BCAST DATE], [LEN],  
    [CREATIVE], SUM(SPEND), file_ID, [create_date]
FROM  
    dbo.mdl_drtv_part_b_sl
WHERE
    [bcast date] = '2018-11-15'
    -- AND region LIKE 'ec%'
    AND creative = 'GET MORE - HYBRID'
GROUP BY 
    [ESTIMATE NAME], [REGION], [MARKET NAME], [BCAST DATE], [LEN],
    [CREATIVE], file_ID, [create_date]

提前感谢您。

这里有一个可能的解决方案:

update dbo.mdl_drtv_part_b_sl
set SPEND = 
(
select sum(SPEND)
from dbo.mdl_drtv_part_b_sl mdp
where
mdp.[ESTIMATE NAME]= dbo.mdl_drtv_part_b_sl.[ESTIMATE NAME]
and
mdp.[REGION]= dbo.mdl_drtv_part_b_sl.[REGION]
and
mdp.[MARKET NAME]= dbo.mdl_drtv_part_b_sl.[MARKET NAME]
and
mdp.[BCAST DATE]= dbo.mdl_drtv_part_b_sl.[BCAST DATE]
and
mdp.[BCAST DATE]= dbo.mdl_drtv_part_b_sl.[BCAST DATE]
and
mdp.[LEN]= dbo.mdl_drtv_part_b_sl.[LEN]
and
mdp.[CREATIVE]= dbo.mdl_drtv_part_b_sl.[CREATIVE]
and
mdp.[CREATIVE]= dbo.mdl_drtv_part_b_sl.[CREATIVE]
and
mdp.[file_ID,]= dbo.mdl_drtv_part_b_sl.[file_ID,]
and
mdp.[create_date]= dbo.mdl_drtv_part_b_sl.[create_date]
)
然后在更新
SPEND
列后,可以使用窗口功能删除重复项:

;with cte as (
  select row_number() over (partition by [ESTIMATE NAME] ,[REGION], [MARKET NAME] , [BCAST DATE],[LEN],[CREATIVE] ,[file_ID],[create_date] order by [ESTIMATE NAME] desc) rn
  FROM dbo.mdl_drtv_part_b_sl)
delete from cte where rn> 1

您可以尝试根据您的选择在子查询上使用带有联接的更新

update  your_table  
SET m.SPEND = t.sum_spend
FROM your_table m 
INNER JOIN (
  SELECT [ESTIMATE NAME] ,[REGION], [MARKET NAME] 
      , [BCAST DATE],[LEN],[CREATIVE]
      ,  SUM(SPEND) sum_spend , file_ID,[create_date]
  FROM  dbo.mdl_drtv_part_b_sl
  where  [bcast date] = '2018-11-15'
  --and region like 'ec%'
  and creative = 'GET MORE - HYBRID'
  GROUP   BY [ESTIMATE NAME] ,[REGION], [MARKET NAME] , [BCAST DATE],[LEN],[CREATIVE],  file_ID,[create_date]
) t ON t.[ESTIMATE NAME] = m.[ESTIMATE NAME]
      AND t.[REGION] = m.[REGION]
      AND t.[MARKET NAME]  = m.[MARKET NAME] 
      AND t.[BCAST DATE] ) m.[BCAST DATE] 
      AND t.[LEN] = m.[LEN]
      AND t.[CREATIVE] = m.[CREATIVE]
      AND t.file_ID = m.file_ID
      AND t.[create_date] = m.[create_date]

您的sql
select
似乎为您提供了所需的输出,您还需要什么?我需要update语句。是否要将每条记录的
SPEND
列设置为其组的
SPEND
sum
?是的。当估算名称、地区、市场名称、bcast_日期、len_creative相同时,我想按其文件id对支出列求和。对于上面的例子,我有两条记录,文件_id=5862,我想将这两行相加,使其成为一行。我尝试了您提供的查询,我看到它在“支出”列中进行了相加,但我仍然看到3条记录,而不是2条记录451 4Q18东中部EC PIT PA 2018-11-15 60获取更多-混合760.00 5862 2019-04-06 04:30:02.623 452 4Q18东部中东部EC PIT PA 2018-11-15 60获取更多-混合760.00 5862 2019-04-06 04:30:02.623 1929 4Q18中东部EC PIT PA 2018-11-15 60获取更多-混合646.00 5863 2019-04-06 04:31:32.163一旦金额更新,我想删除mdl_drtv_part_b_master_id=452的位置,这样我就不会在表中有重复记录。@swathi现在我明白你的意思了,答案已更新。看看这是不是你需要的。