如何排除超过累计总和的行?
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
我有一个简单的查询如下:
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