在Visual Studio中计算SQL数据库记录之间的数据

在Visual Studio中计算SQL数据库记录之间的数据,sql,visual-studio,Sql,Visual Studio,我正在尝试计算记录的燃油加满时的每加仑英里数。我的表格由以下部分组成: FillUp(CarID, Date, ODReading, Gallons, StopGo, Highway, FillupID, MPG) 我想从之前的记录中减去ODReading,然后用加仑除以这个计算值 在Visual Studio 2008的列属性(公式)部分中,如何在记录之间工作以实现这一点?看起来,您为此任务选择了错误的工具。 SQL server及其接口设计为分别在每一行上操作 我会尝试使用托管(c#或vb

我正在尝试计算记录的燃油加满时的每加仑英里数。我的表格由以下部分组成:

FillUp(CarID, Date, ODReading, Gallons, StopGo, Highway, FillupID, MPG)
我想从之前的记录中减去ODReading,然后用加仑除以这个计算值


在Visual Studio 2008的列属性(公式)部分中,如何在记录之间工作以实现这一点?

看起来,您为此任务选择了错误的工具。 SQL server及其接口设计为分别在每一行上操作


我会尝试使用托管(c#或vb.net)代码来完成此任务。

看起来,您为此任务选择了错误的工具。 SQL server及其接口设计为分别在每一行上操作


我会尝试使用托管(c#或vb.net)代码来实现这一点。

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


您需要使用“orderby”子句将行放入序列中。然后你可以尝试各种各样的技巧。例如,如果您有一个“sequence”列,您可以对B.sequence=a.sequence+1进行自连接。这将在结果集中为您提供一行,其中包含来自“当前”行和“以前”行的数据。

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


您需要使用“orderby”子句将行放入序列中。然后你可以尝试各种各样的技巧。例如,如果您有一个“sequence”列,您可以对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。

使用窗口查询可以非常轻松地完成此操作:

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。

当您可以为此创建查询时,toy为什么要在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

当您可以为其创建查询时,toy为什么要在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

请更具体地说明您所指的是哪些“列属性”。请更具体地说明您所指的是哪些“列属性”。并且可能在f2.ODReading-f1.ODReading X-)周围使用()很好。。。对这些编辑要更加小心。修正了。可能在f2.ODReading-f1.ODReading X-)附近使用()很好的捕获。。。对这些编辑要更加小心。固定的。