如何仅获取每行中添加字段构成所需数量的行?

时间:2013-07-01 20:53:50

标签: sql sql-server

我有一个数量值可以是任何东西。对于这个例子,我们假设它是75。

我有一个查询,它返回一组行,显示散布在该地点(物理上)的不同分档中的项目数。该列表按排序顺序排列。

我想过滤行以仅显示满足所需数量所需的行。这些行按排序顺序排列,并且始终按排序顺序排列,即仅排第1行或第1行和第2行,或1,2,3等,但从不排第1,3,5行。

这是一个需要过滤的示例,只返回数量= 75的前两行:

row  item count
1       20
2       60
3        7
4       20

如果仍然需要某种运行总量或数量并且剩余的物品数量也可能很大,但这可能是一个太过分的步骤。

2 个答案:

答案 0 :(得分:0)

DECLARE @target int = 75;

DECLARE @t TABLE (rownum int, value int);
INSERT @t VALUES (1,60),(2,20),(3,7),(4,20);

WITH t_sum AS (
  SELECT
    rownum,
    value,
    SUM(value) OVER(ORDER BY rownum) AS r_total
  FROM @t
)
SELECT
  rownum,value
FROM t_sum
WHERE r_total - value < @target

答案 1 :(得分:0)

SQL Server 2012直接支持累积总和。在早期版本中,您需要以不同方式进行计算。我喜欢用相关的子查询来做这件事:

select row, itemcount,
       (select sum(itemcount)
        from t t2
        where t2.row <= t.row
       ) as cumsum
from t

接下来,您需要第一行大于给定值。为此,使用子查询和一些算术:

select t.row, t.itemcount
from (select row, itemcount,
             (select sum(itemcount)
              from t t2
              where t2.row <= t.row
             ) as cumsum
      from t
     ) t
where 75 > cumsum - itemcount and 75 <= cumsum;

where子句背后的逻辑相当简单。 cumsum必须大于75截止值。但是,可以有多行满足此条件。您希望cumsum之前的值小于75的需求 - 您可以通过减去当前itemcount来获得。