7R903 发表于 2024-4-16 11:36

Sql Server 两表相减

这是我的数据源,需要实现@test 表的Qty要减去@test1表的Qty,条件是Customer相同,不清楚如何操作,没有思路





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

是要整个的计算过程呢?还是只要最终计算结果?

只要最终结果:SELECTCustomer,SUM(A.QTY) - SUM(B.QTY) QTY FROM TESTA
                   LEFT JOINTEST1 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

DECLARE @i INT = 0, @j INT = 0, @id1 INT, @Qt1 INT = 0, @Qt2 INT=0;

WHILE @i <= (SELECT COUNT(1) FROM @test)
BEGIN
    IF @Qt1 < @Qt2OR (@Qt1 = 0 AND @Qt2 = 0)
    BEGIN
      SET @i = @i + 1;
      SELECT @Id1 = ID, @Qt1 = @Qt1 + Qty FROM @test 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
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 相减就完了。

7R903 发表于 2024-4-16 21:59

sky_walk 发表于 2024-4-16 11:46
是要整个的计算过程呢?还是只要最终计算结果?

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

这个不行,因为数据一边多一边少,sum(A.Qty)会出现笛卡尔积的情况
页: [1] 2
查看完整版本: Sql Server 两表相减