【问题标题】:Get rows in SQL Until sum of a column(purchase qty) exceed Closing stock qty在 SQL 中获取行直到一列的总和(购买数量)超过期末库存数量
【发布时间】:2017-08-28 18:09:35
【问题描述】:

我有两张桌子。采购表和期末库存表。

采购表

收盘价

我想根据 Transaction_Date desc 从 purchase 表中返回所有行,直到 sum(Purchase_qty) 超过 CLOSING STOCK TABLE 表中的 Closing_Stock。

假设采购表中的 Material_Code AB01 是 CLOSING STOCK TABLE 表中的 42。在这种情况下,返回的行将如下所示

如您所见,前 4 条记录的 sum(Purchase_qty) 为 43,因此超过了 42。我不想显示最后一列。所以逻辑将是当 sum(Purchase_qty) 超过 closing_stock 时停止。

我尝试了以下查询,但没有达到结果。任何意见都非常感谢。

SELECT A.Material_Code,A.Transaction_Date, A.Purchase_qty, 
sum(A.Purchase_qty) OVER (ORDER BY Material_Code) AS total 
from Purchase A 
left join Closing_Stock B ON
A.Material_Code = B.Material_Code
where A.Purchase_qty <= B.Closing_Stock
order by A.Transaction_Date desc

【问题讨论】:

  • 是 MySQL 还是 sqlserver?
  • 这是 SQL Server @ttallierchio

标签: sql sql-server


【解决方案1】:

你很接近:

select csp.*
from (select cs.Material_Code, p.Transaction_Date, p.Purchase_qty, 
             sum(p.Purchase_qty) OVER (ORDER BY cs.Material_Code) AS running_qty,
             cs.closing_stock
      from closing_stock cs left join
           Purchase p
           on cs.Material_Code = p.Material_Code
     ) csp
where running_qty - Purchase_qty < closing_stock
order by Transaction_Date desc;

注意:这使您最多可以完成超过收盘存量的第一笔交易。如果您希望最后一个小于该值,请省略 - Purchase_qty

【讨论】:

  • 它说无效的列数量
【解决方案2】:

在“row id”=2(在 Purchase 表中)我们可以看到“Purchase_qty”=12,但在结果表中,同一行 (id=2) 的 Purchase_qty=17。我想,你在某个地方犯了错误。 在我的示例中,您会在该行中找到“17”。

在这里你有正确的选择:

select Material_Code, Purchase_qty, Transaction_Date 
from Purchase p  
where Transaction_Date >= isnull((
    select max(tr_d) from (
        select Material_Code mt_cod, Transaction_Date tr_d, sum(Purchase_qty) OVER (ORDER BY Transaction_Date desc) AS total
        from Purchase iw
        where iw.Material_Code=p.Material_Code  
    ) as query  
    where total >= (select i.Closing_Stock from Closing_Stock i where i.Material_Code=mt_cod)   
), cast('1900-1-1' as date))
order by 1, 3 desc

我专注于构建一个查询,就像您的示例一样,这就是查询似乎有点复杂的原因。如果您可以在几个小查询(而不是一个)中构建它,那么性能会更好。这也取决于你有多大的桌子。

我的查询结果:

Material_Code   Purchase_qty    Transaction_Date
AB01    6   2017-08-30 11:05:00.000
AB01    11  2017-08-30 11:04:00.000
AB01    9   2017-08-30 11:03:00.000
AB01    17  2017-08-30 11:02:00.000
AB05    29  2017-08-30 11:08:00.000
AB05    44  2017-08-30 11:07:00.000
AB05    22  2017-08-30 11:06:00.000

检查我的查询的数据:

create table Purchase(Material_Code varchar(10), Purchase_qty integer, Transaction_Date datetime)
insert Purchase values
('AB01',22,'2017-08-30 11:01:00'),
('AB01',17,'2017-08-30 11:02:00'),
('AB01',9 ,'2017-08-30 11:03:00'),
('AB01',11,'2017-08-30 11:04:00'),
('AB01', 6,'2017-08-30 11:05:00'),
('AB05',22,'2017-08-30 11:06:00'),
('AB05',44,'2017-08-30 11:07:00'),
('AB05',29,'2017-08-30 11:08:00')

create table Closing_Stock(Material_Code varchar(10),Closing_Stock integer)
insert Closing_Stock values
('AB01',42),
('AB05',142)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多