我正在尝试计算记录的燃料满载的每加仑英里数。我的表由流动的:在Visual Studio中记录SQL数据库之间的计算数据
FillUp(CarID, Date, ODReading, Gallons, StopGo, Highway, FillupID, MPG)
我想通过这个计算值中减去从以前的记录和分裂加仑ODReading。
在Visual Studio 2008的列属性(公式)部分中,如何在记录之间实现此操作?
我正在尝试计算记录的燃料满载的每加仑英里数。我的表由流动的:在Visual Studio中记录SQL数据库之间的计算数据
FillUp(CarID, Date, ODReading, Gallons, StopGo, Highway, FillupID, MPG)
我想通过这个计算值中减去从以前的记录和分裂加仑ODReading。
在Visual Studio 2008的列属性(公式)部分中,如何在记录之间实现此操作?
看起来,您已经为此任务选择了错误的工具。 SQL服务器和它的接口被设计为分别在每一行上操作。
我会尝试使用托管(c#或vb.net)代码来执行此操作。
本身,查询结果集中的行没有任何顺序。没有“记录之间”。
您将需要使用“ORDER BY”子句将行放入序列中。那么你可以尝试各种技巧。例如,如果你有一个“序列”列,你可以在B.Sequence = A.Sequence + 1上做一个自联接。这会为结果集中的单行提供来自“当前”和“先前”行的数据。
您可以使用窗口查询做到这一点很容易:
WITH FillUp_CTE AS
(
SELECT
CarID, Date, ODReading,
ROW_NUMBER() OVER (PARTITION BY CarID ORDER BY Date) AS RowNum
FROM FillUp
)
SELECT f1.CarID, f1.Date, (f2.ODReading - f1.ODReading)/f1.Gallons AS Mileage
FROM FillUp_CTE f1
INNER JOIN FillUp_CTE f2
ON f2.CarID = f1.CarID
AND f2.RowNum = f1.RowNum + 1
您将无法单独计算列来做到这一点。您需要像上面那样实际编写SQL。
也许可以使用*()*在f2.ODReading - f1.ODReading ** X - )** – 2010-04-26 19:21:11
良好的捕获...要对这些编辑更加小心。固定。 – Aaronaught 2010-04-26 19:24:09
为什么玩具想在C#中这样做,当你可以为此创建一个查询。
喜欢的东西
DECLARE @FillUp TABLE(
CarID INT,
Date DATETIME,
ODReading FLOAT,
Gallons FLOAT,
StopGo FLOAT,
Highway VARCHAR(20),
FillupID INT,
MPG FLOAT
)
INSERT INTO @FillUp (CarID, Date, ODReading, Gallons) SELECT 1, '01 Jan 2010', 100, 20
INSERT INTO @FillUp (CarID, Date, ODReading, Gallons) SELECT 1, '01 Jan 2010', 150, 30
INSERT INTO @FillUp (CarID, Date, ODReading, Gallons) SELECT 1, '02 Jan 2010', 250, 30
;WITH ODOs AS (
SELECT *,
(
SELECT TOP 1
ODReading
FROM @FillUp
WHERE CarID = fu.CarID
AND ODReading > fu.ODReading
ORDER BY ODReading
) NextOD
FROM @FillUp fu
)
SELECT *,
(NextOD - ODReading)/Gallons CalculatedMPG
FROM ODOs
请具体谈谈这“列属性”你指的是。 – 2010-04-26 19:13:27