ACCESS / SQL:计算行之间的差异(不是日期)

时间:2011-02-17 15:58:11

标签: sql ms-access difference-between-rows

我在这里查看了一些问题,但没有找到适合我案例的问题。

我正在尝试编写一个将输出行之间差异的查询

这是一张表:

ITEM     CYCLES
--------------------
itemA     5
itemA     17
itemA     20  
itemA     22
itemB     26
itemB     30
itemB     37

它实际上是通过查询获得的,并且按顺序(项目,周期)获得

这是我想要查询的内容:

itemA 12
itemA 3
itemA 2
itemB 4
itemB 7

我完全不知道如何继续使用SQL。它甚至可能吗? 还是我必须写一个函数?

*****************************EDIT*********************************

我为缺乏准确性甚至一些荒谬的错误而道歉。我急忙赶紧写道:/
我正在分析项目失败,需要在失败之间输出循环。

  • ITEM列只是商品ID,
  • CYCLES是项目发生故障时的周期数。

今天真的看着它我不明白为什么我把那个我没有的中间栏(A,B,C ......)放在我的桌子里。
事实上,我不需要输出零值,但无论如何都不应该。 我会尝试提供的解决方案,然后回来;谢谢你的答案!

4 个答案:

答案 0 :(得分:3)

根据您问题的更改,这是一个更新的解决方案。请注意,您需要将Qry更改为查询名称:

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;

这会产生以下输出:

Item    Diff
itemA   12
itemA    3
itemA    2
itemB    4
itemB    7

我假设您的示例输出中的6是一个拼写错误,因为30 - 26 = 4

答案 1 :(得分:1)

假设我们的列名为ItemName, Letter, Num,可能会执行以下操作:

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])

请注意,您无法使用QBE网格创建此内容。您需要在代码或SQL视图中创建。

答案 2 :(得分:1)

怎么样:

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;

答案 3 :(得分:0)

如果您的第四列带有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

然后您可以使用以下查询:

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

准确地生成您所要求的内容:

Col1    Diff
itemA   12
itemA    3
itemA    2
itemB    4
itemB    7

您需要管理Col0数据以确保不会出现间隙(即自动编号字段不是一个好主意)。

以上所有内容都已经说过,如果你告诉我们你真正想要实现的目标,我认为可能有更好的方法来做你想做的事。