我在这里查看了一些问题,但没有找到适合我案例的问题。
我正在尝试编写一个将输出行之间差异的查询
这是一张表:
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*********************************
我为缺乏准确性甚至一些荒谬的错误而道歉。我急忙赶紧写道:/
我正在分析项目失败,需要在失败之间输出循环。
今天真的看着它我不明白为什么我把那个我没有的中间栏(A,B,C ......)放在我的桌子里。
事实上,我不需要输出零值,但无论如何都不应该。
我会尝试提供的解决方案,然后回来;谢谢你的答案!
答案 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
数据以确保不会出现间隙(即自动编号字段不是一个好主意)。
以上所有内容都已经说过,如果你告诉我们你真正想要实现的目标,我认为可能有更好的方法来做你想做的事。