如何排除超过累计总和的行?

How can I exclude rows that exceed the accumulative sum?

我有一个简单的查询如下:

SELECT fam1 Fam2,
       dim,
       quantit_pr_vue,
       quantit_restante,
       d_signation_2,
       longueur,
       largeur,
       d_signation_1,
       d_cors,
       face,
       nuance
FROM   hel
GROUP  BY fam1,
          fam2,
          dim,
          quantit_pr_vue,
          quantit_restante,
          d_signation_2,
          longueur,
          largeur,
          d_signation_1,
          d_cors,
          face,
          nuance
ORDER  BY fam2,
          longueur,
          nuance;

结果如下:

Fam2    Dim Quantit_pr_vue  Quantit_restante    D_signation_2   Longueur    Largeur D_signation_1   D_cors  FACE    NUANCE
ST1 296 25  25  ST MDF 2F KEN02321 280X210X18 SUP LIG   280 210 SM 2F KENNY 02321 296 SUP LIG   FONCE   2F  1
ST1 296 50  50  ST MDF 2F KEN02321 280X210X18 SUP LIG   280 210 SM 2F KENNY 02321 296 SUP LIG   FONCE   2F  1
ST1 296 100 100 ST MDF 2F KEN02321 280X210X18 SUP LIG   280 210 SM 2F KENNY 02321 296 SUP LIG   FONCE   2F  1
ST1 296 150 150 ST MDF 2F BALANCE 280X210X18 SUPER LIGHT    280 210 SM 2F BALANCE 296 SUPER LIGHT   BALANCE 2F  4
ST1 296 300 300 ST MDF 2F BALANCE 280X210X18 SUPER LIGHT    280 210 SM 2F BALANCE 296 SUPER LIGHT   BALANCE 2F  4

我想排除最后一行 Quantit_restante = 300 因为当它与之前的记录相加时,它超过了 500。

截图只显示了一组Fam2 =ST1,Dim=296,Logueur=280,Largeur =210,FACE = 2F.

您可以使用 window 函数 SUM() 获取 运行 总数并排除 运行 总数超过 500 的行:

SELECT *
FROM (
  SELECT *, SUM(Quantit_restante) OVER (ORDER BY Fam2) total
  FROM [dbo].[hel]
) t
WHERE total <= 500
ORDER BY Fam2;

也适用于滚动总数。

SELECT 
 [Fam2], 
 [Dim], 
 [Quantit_pr_vue], 
 [Quantit_restante],
 [D_signation_2], 
 [Longueur], 
 [Largeur], 
 [D_signation_1], 
 [D_cors], 
 [FACE], 
 [NUANCE]
FROM [hel] AS h
CROSS APPLY (
    SELECT SUM(Quantit_restante) AS RollingTotal
    FROM [hel] h2
    WHERE h2.Fam2 = h.Fam2
      AND h2.Dim = h.Dim
      AND h2.Longueur = h.Longueur
      AND h2.Largeur = h.Largeur
      AND h2.FACE = FACE
      AND h2.Quantit_restante <= h.Quantit_restante
) ca
WHERE Fam2 = 'ST1' 
  AND Dim = 296
  AND Longueur = 280
  AND Largeur = 210
  AND FACE = '2F'
  AND RollingTotal <= 500
ORDER BY Fam2, Dim, Longueur, Largeur, FACE, Quantit_restante;
Fam2 | Dim | Quantit_pr_vue | Quantit_restante | D_signation_2                            | Longueur | Largeur | D_signation_1                 | D_cors  | FACE | NUANCE
:--- | --: | -------------: | ---------------: | :--------------------------------------- | -------: | ------: | :---------------------------- | :------ | :--- | -----:
ST1  | 296 |             25 |               25 | ST MDF 2F KEN02321 280X210X18 SUP LIG    |      280 |     210 | SM 2F KENNY 02321 296 SUP LIG | FONCE   | 2F   |      1
ST1  | 296 |             50 |               50 | ST MDF 2F KEN02321 280X210X18 SUP LIG    |      280 |     210 | SM 2F KENNY 02321 296 SUP LIG | FONCE   | 2F   |      1
ST1  | 296 |            100 |              100 | ST MDF 2F KEN02321 280X210X18 SUP LIG    |      280 |     210 | SM 2F KENNY 02321 296 SUP LIG | FONCE   | 2F   |      1
ST1  | 296 |            150 |              150 | ST MDF 2F BALANCE 280X210X18 SUPER LIGHT |      280 |     210 | SM 2F BALANCE 296 SUPER LIGHT | BALANCE | 2F   |      4

db<>fiddle here