SQL:update request-根据列的行数总和,删除旧副本

SQL:update request-根据列的行数总和,删除旧副本,sql,sql-server,Sql,Sql Server,问题 我有以下情况: 当我网站上的用户未登录时,他可以将产品添加到购物车。但当他点击shopcart信息页面中的“购买”按钮时,他应该登录进行结帐并完成订单。这是这里的主要逻辑 所以想象一下,用户有2个产品,还没有登录,但他已经在网站上有了帐户。然后,他将登录,他已经有完全相同的帐户上的2个产品,但数量不同 目标: 我想对shopcart表中的类似产品进行汇总,然后删除类似产品的副本 Sql表 当用户刚刚登录时,我希望得到以下结果: Id Qt user_id

问题

我有以下情况: 当我网站上的用户未登录时,他可以将产品添加到购物车。但当他点击shopcart信息页面中的“购买”按钮时,他应该登录进行结帐并完成订单。这是这里的主要逻辑

所以想象一下,用户有2个产品,还没有登录,但他已经在网站上有了帐户。然后,他将登录,他已经有完全相同的帐户上的2个产品,但数量不同

目标:

我想对shopcart表中的类似产品进行汇总,然后删除类似产品的副本

Sql表

当用户刚刚登录时,我希望得到以下结果:

Id            Qt   user_id     outer_user_id

product-1     4      22            NULL
product-2     3      22            NULL
product-2     5      27            NULL

-- outer user with outer_user_id = 45 will login as inner user with user_id = 22
正如你所看到的,我想从多个相似的产品中创建独特的产品,并对它们的数量求和。如何使用请求在SQL Server数据库中执行此操作?谢谢大家!


注意:查询应该更新表并删除一些行,而不是选择结果。

下面是代码片段:使用update语句和CTE删除重复记录。例如,我只是按id分组,但对于您的情况,您需要按用户id和产品id分组

 Create table #temp(id int , dvalue int)

Insert into #temp(id,dvalue) values(1,10)
Insert into #temp(id,dvalue) values(1,2)
Insert into #temp(id,dvalue) values(1,3)
Insert into #temp(id,dvalue) values(2,10)
Insert into #temp(id,dvalue) values(2,1)
Insert into #temp(id,dvalue) values(2,1)

select * from #temp

Update t1 set t1.dvalue=(select sum(dvalue) from #temp t group by id having 
t.id=t1.id) from #temp t1;

WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY id order by dvalue) AS RN
FROM #temp
)

DELETE FROM CTE WHERE RN<>1

我刚刚使用了一些其他表和列名-希望它能帮助您。

下面是代码片段:使用update语句和CTE删除重复记录。例如,我只是按id分组,但对于您的情况,您需要按用户id和产品id分组

 Create table #temp(id int , dvalue int)

Insert into #temp(id,dvalue) values(1,10)
Insert into #temp(id,dvalue) values(1,2)
Insert into #temp(id,dvalue) values(1,3)
Insert into #temp(id,dvalue) values(2,10)
Insert into #temp(id,dvalue) values(2,1)
Insert into #temp(id,dvalue) values(2,1)

select * from #temp

Update t1 set t1.dvalue=(select sum(dvalue) from #temp t group by id having 
t.id=t1.id) from #temp t1;

WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY id order by dvalue) AS RN
FROM #temp
)

DELETE FROM CTE WHERE RN<>1


我刚刚使用了一些其他的表和列名-希望它能帮助您。

您想要一个group by语句select Id,sumQt group by Id如何定义哪个产品更旧?或者仅仅删除所有应该更新的内容就足够了?@ChrisFlynn我认为这只是答案的一部分,因为OP也要求更新和删除我不想选择,但要更新表格请查看question@JorgeCampos,确切地说,您需要一个group by语句select Id,sumQt group by IDQ您如何定义哪个产品较旧?或者仅仅删除所有应该更新的内容就足够了?@ChrisFlynn我认为这只是答案的一部分,因为OP也要求更新和删除我不想选择,但要更新表格请查看question@JorgeCampos,确切地说,我在想一个没有临时表的方法,也许是合并。但这可能是最好的方法。是的,你在普通桌子上也是这样做的@QuarkWait,仅根据用户\u id=22和外部\u用户\u id=45更改表时遇到一些问题…我就是不知道如何根据这些id对表进行分组s@RohitPadma,如何按用户id对相关表进行分组?我就是想不出来。。。首先,我们可以取outer\u user\u id=45的行,设置user\u id=22,outer\u user\u id=NULL,这样我们就可以去掉outer\u user\u id。。。但在这之后,我就不明白如何将所有Qt求和,其中user_id=22,并将其全部分组到更新结果中,只留下唯一的行。你能帮我吗?我在想一个没有临时表的方法,也许是合并。但这可能是最好的方法。是的,你在普通桌子上也是这样做的@QuarkWait,仅根据用户\u id=22和外部\u用户\u id=45更改表时遇到一些问题…我就是不知道如何根据这些id对表进行分组s@RohitPadma,如何按用户id对相关表进行分组?我就是想不出来。。。首先,我们可以取outer\u user\u id=45的行,设置user\u id=22,outer\u user\u id=NULL,这样我们就可以去掉outer\u user\u id。。。但在这之后,我就不明白如何将所有Qt求和,其中user_id=22,并将其全部分组到更新结果中,只留下唯一的行。你能帮我吗?