吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 420|回复: 13
收起左侧

[求助] Sql Server 两表相减

  [复制链接]
cn005897 发表于 2024-4-16 11:36
这是我的数据源,需要实现@test 表的Qty要减去@test1表的Qty,条件是Customer相同,不清楚如何操作,没有思路



[SQL] 纯文本查看 复制代码

declare @test table
(
	ID int identity(1,1),
	Customer varchar(15),
	Qty int
)



declare @test1 table
(
	ID int identity(1,1),
	Customer varchar(15),
	Qty int
)



insert into @test values('113375',2700)
insert into @test values('113375',4500)
insert into @test values('113375',8100)



insert into @test1 values('113375',2100)
insert into @test1 values('113375',2400)
insert into @test1 values('113375',2100)
insert into @test1 values('113375',2100)
insert into @test1 values('113375',1800)
insert into @test1 values('113375',2100)


--在Customer相同时,将@test表的Qty依次减去@test1表的Qty,
--2700-2100=600
--4500+600-2400=2700
--2700-2100=600
--8100+600-2100=6600
--6600-1800=4800
--4800-2100=2700
--最终@test 输出3 111375 2700



发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

flwkwl 发表于 2024-4-16 11:41
这种简单问题gpt真能搞定
sky_walk 发表于 2024-4-16 11:46
是要整个的计算过程呢?还是只要最终计算结果?

只要最终结果:SELECT  Customer,SUM(A.QTY) - SUM(B.QTY) QTY FROM TEST  A
                   LEFT JOIN  TEST1 B ON A.Customer = B.Customer
                   GROUP BY A.Customer
ldapj 发表于 2024-4-16 11:46
Airey 发表于 2024-4-16 11:55
要实现您描述的操作,即根据Customer相同这一条件,从@test表的Qty中减去@test1表的Qty,您可以使用SQL的UPDATE语句结合JOIN操作。以下是一个基本的SQL示例,展示了如何实现这一功能:

sql语句如下:

UPDATE @test  
SET @test.Qty = @test.Qty - COALESCE(@test1.Qty, 0)  
FROM @test  
LEFT JOIN @test1 ON @test.Customer = @test1.Customer;

这里的关键点解释:

使用LEFT JOIN来确保@test表中的所有记录都会被更新,即使@test1表中没有匹配的Customer。
使用COALESCE函数来处理@test1中Qty为NULL的情况。如果@test1.Qty是NULL,则COALESCE会返回0,这样就不会影响@test.Qty的值。
在SET子句中,我们从@test.Qty中减去@test1.Qty的值(或0,如果@test1.Qty是NULL)。
请注意,这只是一个基本的示例,并且假设了您的数据库支持这种语法。不同的数据库系统(如MySQL、SQL Server、Oracle等)可能有一些细微的语法差异。确保根据您的具体数据库系统调整此查询。

以上来自GPT自动生成。
lorzl 发表于 2024-4-16 14:03
[SQL] 纯文本查看 复制代码
DECLARE @i INT = 0, @j INT = 0, [url=home.php?mod=space&uid=105320]@id1[/url] INT, @Qt1 INT = 0, @Qt2 INT=0;

WHILE @i <= (SELECT COUNT(1) FROM @test)
BEGIN
    IF @Qt1 < @Qt2  OR (@Qt1 = 0 AND @Qt2 = 0)
    BEGIN
        SET @i = @i + 1;
        SELECT @Id1 = ID, @Qt1 = @Qt1 + Qty FROM [url=home.php?mod=space&uid=101628]@test[/url] WHERE ID = @i;
    END
    PRINT @Qt1
    WHILE @j <= (SELECT COUNT(1)FROM @test1) 
    BEGIN
        SET @j = @j + 1;
        SELECT @Qt2 = Qty FROM @test1 WHERE ID = @j;
        IF @Qt1 - @Qt2 > 0
        BEGIN
            SELECT @Qt1 = @Qt1 - @Qt2;
            BREAK;
        END
    END;
END;
SELECT ID,Customer,@Qt1 + @Qt2 结果  FROM @test WHERE ID  = @Id1
lorzl 发表于 2024-4-16 14:17
lorzl 发表于 2024-4-16 14:03
[mw_shl_code=sql,true]DECLARE @i INT = 0, @j INT = 0, @id1 INT, @Qt1 INT = 0, @Qt2 INT=0;

WHILE @ ...

不对 其他数据可能会卡死
kongkong1225 发表于 2024-4-16 16:51
直接left join 左连接 然后group by Customer 就可以了
初出江湖的Ryan 发表于 2024-4-16 17:26
如果忽略过程,只要结果的话,两表加起来,然后 join 相减就完了。
 楼主| cn005897 发表于 2024-4-16 21:59
sky_walk 发表于 2024-4-16 11:46
是要整个的计算过程呢?还是只要最终计算结果?

只要最终结果:SELECT  Customer,SUM(A.QTY) - SUM(B.QT ...

这个不行,因为数据一边多一边少,sum(A.Qty)会出现笛卡尔积的情况
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-30 11:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表