【问题标题】:Sql - SELECT rows until the sum of a row is a certain valueSql - 选择行直到行的总和为某个值
【发布时间】:2018-02-12 21:02:38
【问题描述】:

我在这里看到过其他类似的问题,但它们并不能完全满足我的需求,至少我是这么认为的。

我有一个包含以下列的 [reciepts] 表: 收据ID, 客户ID, 数量 ...

让我们说:

我有 5 份来​​自客户 1 的未付款收据:

reciept_id: 1 | Ammount: 110€

reciept_id: 2 | Ammount: 110€

reciept_id: 3 | Ammount: 130€

reciept_id: 4 | Ammount: 110€

reciept_id: 5 | Ammount: 190€

所以,客户 1 付给我 220 欧元。

现在我需要选择最旧的收据,直到满足这 220 欧元的总和,但只能按顺序排列,例如(收据 1 + 收据 2)而不是(收据 1 + 收据 4)。

你能帮我找到最好的查询吗,或者至少给我指出最好的答案?

提前致谢:)

【问题讨论】:

  • MySQL 还是 SQL 服务器?
  • 高于220的行是什么情况?
  • 抱歉,这是 SQL-Server @Raymond Nijland
  • @Badiparmagi,如果存在高于 220 的行,则查询中不应返回任何值。谢谢你的问题。
  • 我将创建另一个列,其中包含“支付金额”。我将现有的“金额”列称为“应付金额”。程序:选择最旧的未完全支付的收据,并尽可能多地支付:添加到“应付金额”并从“已支付金额”中减去。以此类推,一步一步,直到没有钱支付到期金额。我不会担心这需要多次查询。

标签: sql-server


【解决方案1】:

假设总和将按顺序匹配行。以下查询将起作用。

DECLARE @Table TABLE(Reciept_Id INT , Amount INT)
INSERT INTO @Table
SELECT * 
FROM   (
         VALUES (1, 110),(2,110),(3,130),(4,110),(5,190)
       ) t (Reciept_Id, Amount) 

--Query

SELECT * FROM
(
    SELECT 
    Reciept_Id, 
    Amount,
    SUM(Amount) OVER(ORDER BY Reciept_Id ROWS 
       BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Total
FROM @Table
) T
WHERE T.Total <= 220

输出:

 Reciept_Id   Amount    Total
-----------   -------  ----------
    1          110      110
    2          110      220

注意:查询将在 SQL-Server 2012 及更高版本中工作。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2019-03-16
    • 2020-08-01
    • 2023-01-19
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多