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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top