2010-04-26 15 views
1

我正在尝试计算记录的燃料满载的每加仑英里数。我的表由流动的:在Visual Studio中记录SQL数据库之间的计算数据

FillUp(CarID, Date, ODReading, Gallons, StopGo, Highway, FillupID, MPG) 

我想通过这个计算值中减去从以前的记录和分裂加仑ODReading。

在Visual Studio 2008的列属性(公式)部分中,如何在记录之间实现此操作?

+0

请具体谈谈这“列属性”你指的是。 – 2010-04-26 19:13:27

回答

0

看起来,您已经为此任务选择了错误的工具。 SQL服务器和它的接口被设计为分别在每一行上操作。

我会尝试使用托管(c#或vb.net)代码来执行此操作。

1

本身,查询结果集中的行没有任何顺序。没有“记录之间”。

您将需要使用“ORDER BY”子句将行放入序列中。那么你可以尝试各种技巧。例如,如果你有一个“序列”列,你可以在B.Sequence = A.Sequence + 1上做一个自联接。这会为结果集中的单行提供来自“当前”和“先前”行的数据。

0

您可以使用窗口查询做到这一点很容易:

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。

+0

也许可以使用*()*在f2.ODReading - f1.ODReading ** X - )** – 2010-04-26 19:21:11

+1

良好的捕获...要对这些编辑更加小心。固定。 – Aaronaught 2010-04-26 19:24:09

0

为什么玩具想在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 
相关问题