Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按一定顺序从几行中删除数量_Sql_Sql Server - Fatal编程技术网

Sql 按一定顺序从几行中删除数量

Sql 按一定顺序从几行中删除数量,sql,sql-server,Sql,Sql Server,我想写下一个更新/删除查询,该查询允许我请求删除x个数量,并且该查询将在有值时删除/更新行 例如,下面的表格是我的一个简化版本,只是为了得到我想做的一些其他验证的想法,但这只是我的主要问题 ╔═══════╦═════╗ ║ Rowid ║ qtd ║ ╠═══════╬═════╣ ║ 1 ║ 2 ║ ╠═══════╬═════╣ ║ 2 ║ 1 ║ ╠═══════╬═════╣ ║ 3 ║ 3 ║ ╠═══════╬═════╣ ║ 4 ║ 4

我想写下一个更新/删除查询,该查询允许我请求删除x个数量,并且该查询将在有值时删除/更新行

例如,下面的表格是我的一个简化版本,只是为了得到我想做的一些其他验证的想法,但这只是我的主要问题

╔═══════╦═════╗
║ Rowid ║ qtd ║
╠═══════╬═════╣
║ 1     ║ 2   ║
╠═══════╬═════╣
║ 2     ║ 1   ║
╠═══════╬═════╣
║ 3     ║ 3   ║
╠═══════╬═════╣
║ 4     ║ 4   ║
╠═══════╬═════╣
║ 5     ║ 3   ║
╠═══════╬═════╣
║ 6     ║ 5   ║
╚═══════╩═════╝
假设我在这里写了一个删除9个数量的查询

最终结果应该是这样的

╔═══════╦═════╗
║ Rowid ║ qtd ║
╠═══════╬═════╣
║ 1     ║ 2   ║
╠═══════╬═════╣
║ 2     ║ 1   ║
╠═══════╬═════╣
║ 3     ║ 3   ║
╠═══════╬═════╣
║ 4     ║ 3*  ║
╠═══════╬═════╣
╠═══════╬═════╣
╚═══════╩═════╝
这里发生了什么:

从第6行中删除了5个数量,因为该行达到0,因此已将其删除。 第5行中删除了3个数量,因为该行达到0,因此已将其删除。 第4行中删除了1个数量,新值已从4更新为3。 我想看看是否可以在sql中直接使用一些可行的选项。为了避免使用其他选项进行一些丑陋的硬编码


通过使用干净的sql选项,我可以将其保存为了解更多信息。

您可以使用累积总和和一些逻辑:

select rowid,
       (case when running_qtd < 5 then 0
             when running_qtd - qtd < 5 then running_qtd - qtd
             else qtd
        end) as amount_left
from (select t.*, sum(qtd) over (order by rowid desc) as running_qtd
      from t
     ) t;

这包括所有行,并将剩余的qtd放入列中

您可以使用累积总和和一些逻辑:

select rowid,
       (case when running_qtd < 5 then 0
             when running_qtd - qtd < 5 then running_qtd - qtd
             else qtd
        end) as amount_left
from (select t.*, sum(qtd) over (order by rowid desc) as running_qtd
      from t
     ) t;

这包括所有行,并将剩余的qtd放入列中

这里没有删除或更新。我仍然不知道如何让sql选择要使用的witch选项。@AlexandreCalvario。不要删除行。只需将qtd设置为0。此处没有删除或更新。我仍然不知道如何让sql选择要使用的witch选项。@AlexandreCalvario。不要删除行。只需将qtd设置为0。