Sql server SQL Server:在列上使用sum()和group by更新列
我正在尝试更新SQL Server表,其中我的estimatename、region、marketname、b_date、len、creative、file_id相同,并将支出列相加,使其成为单行 例如: mdl\U drtv\U部件\U b\U主id: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
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现在我明白你的意思了,答案已更新。看看这是不是你需要的。