Accès / SQL: calcul de la différence entre les lignes (pas les dates)
-
14-11-2019 - |
Question
J'ai examiné les questions ici mais je n'en ai pas trouvé une qui convenait à mon cas.
J'essaye d'écrire une requête qui fera la différence entre les lignes
Voici un tableau:
ITEM CYCLES
--------------------
itemA 5
itemA 17
itemA 20
itemA 22
itemB 26
itemB 30
itemB 37
Il est en fait obtenu par une requête, et avec une commande par (article, cycles)
Voici ce que j'aimerais que la requête me donne:
itemA 12
itemA 3
itemA 2
itemB 4
itemB 7
Je n'ai absolument aucune idée de comment procéder à SQL. Est-ce même possible? ou dois-je écrire une fonction?
*****************************EDIT*********************************
J'applique le manque de précision, et même quelques erreurs absurdes. Je me précipitais et j'ai écrit à la hâte: /
J'analyse les défaillances des éléments et je dois sortir des cycles entre les échecs.
- La colonne d'article n'est que l'ID de l'article, et
- Les cycles sont le nombre de cycles que l'élément avait lorsque l'échec s'est produit.
Et en fait, en le regardant aujourd'hui, je ne comprends pas pourquoi j'ai mis cette colonne du milieu (A, B, C ...) que je n'ai pas dans ma table.
Et en effet, je n'ai pas besoin de produire des valeurs zéro, mais il ne devrait pas y en avoir de toute façon. Je vais essayer les solutions fournies et je reviendrai; Merci pour les réponses!
La solution
Voici une solution mise à jour, en fonction des modifications de votre question. Notez que vous devrez changer Qry
au nom de votre requête:
SELECT Qry.Item, Qry.Cycles - (SELECT TOP 1 Cycles FROM Qry AS Q
WHERE Qry.Item=Q.Item
AND Q.Cycles < Qry.Cycles
ORDER BY Q.Cycles DESC) AS Diff
FROM Qry
WHERE (SELECT TOP 1 Cycles FROM Qry AS Q
WHERE Qry.Item=Q.Item AND Q.Cycles < Qry.Cycles) Is Not Null
ORDER BY Qry.Item, Qry.Cycles;
Cela produit la sortie suivante:
Item Diff
itemA 12
itemA 3
itemA 2
itemB 4
itemB 7
Je suppose que le 6
dans votre échantillon de sortie était une faute de frappe, car 30 - 26 = 4
.
Autres conseils
En supposant que nos colonnes sont nommées ItemName, Letter, Num
, quelque chose comme ce qui suit pourrait le faire:
SELECT T1.ItemName, T1.Letter
, T1.Num, [T2].[Num]-Nz([T1].[Num],[T2].[Num]) AS Expr1
FROM Table1 AS T1
LEFT JOIN Table1 AS T2
ON (T1.ItemName = T2.ItemName
And Asc([T1].[Letter]) = Asc([T2].[Letter]) - 1 )
Where [T2].[Num] <> Nz([T1].[Num],[T2].[Num])
Notez que vous ne pouvez pas créer cela à l'aide de la grille QBE. Vous devrez créer dans le code ou dans la vue SQL.
Que diriez-vous:
SELECT b.Item, b.[No], (
SELECT Top 1 a.No
FROM items a
WHERE a.No > b.No
ORDER BY a.Item,a.No) AS NextNo,
[NextNo]-[No] AS Result
FROM items AS b;
C'est beaucoup Plus simple si vous avez une quatrième colonne avec un ID:
Col0 Col1 Col2 Col3
1 itemA A 5
2 itemA B 17
3 itemA C 20
4 itemA D 22
5 itemB A 26
6 itemB B 30
7 itemB C 37
Ensuite, vous pouvez utiliser la requête suivante:
SELECT Tbl.Col1, Tbl.Col3 - Prev.Col3 AS Diff
FROM Tbl INNER JOIN Tbl AS Prev
ON Tbl.Col0 - 1 = Prev.Col0
AND Tbl.Col1 = Prev.Col1
Pour produire exactement ce que vous avez demandé:
Col1 Diff
itemA 12
itemA 3
itemA 2
itemB 4
itemB 7
Vous auriez besoin de gérer le Col0
Les données pour vous assurer de ne pas vous retrouver avec les lacunes (c'est-à-dire, le champ d'objets de automatique serait une mauvaise idée).
Tout ce qui précède ayant été dit, si vous nous faites savoir ce que vous essayez vraiment d'accomplir, je pense qu'il y a probablement une meilleure façon de faire ce que vous voulez.