在sql查询中添加具有上一行的每一行

在sql查询中添加具有上一行的每一行,sql,Sql,假设我有一个表,其值如下: Date sales ===== ===== Jan 100 Feb 150 Mar 500 等等 如何使用以下结果查询此表: Date Sales Total ==== ===== ====== Jan 100 100 Feb 150 250 (Jan + Feb) Mar

假设我有一个表,其值如下:

    Date     sales
   =====     =====
    Jan      100
    Feb      150
    Mar      500
等等

如何使用以下结果查询此表:

Date      Sales      Total
====      =====      ======
Jan        100        100
Feb        150        250 (Jan + Feb)
Mar        500        750 (Jan + Feb + mar)
我知道它可以在SP循环中完成,但有一个简单的查询吗

谢谢你的帮助

谢谢,
J

一个加窗求和应该在几个DBMS上工作。下面是一个SQL Server示例,请告知您使用的是哪一个:

DECLARE @T TABLE ([Date] DATE, [Sales] INT)
INSERT @T VALUES ('1/1/2015', 100), ('2/1/2015', 150), ('3/1/2015', 500)

SELECT
    [Date],
    [Sales],
    SUM([Sales]) OVER (ORDER BY [Date]) AS [Total]
FROM @T
ORDER BY
    [Date]
这将生成以下输出:

Date       Sales       Total
---------- ----------- -----------
2015-01-01 100         100
2015-02-01 150         250
2015-03-01 500         750
由于SQL Server 2008仅从2012年起才在窗口聚合中支持ORDER BY,因此这里提供了一种方法来执行相同的操作。这是非常低效的-只是没有一个非常有效的方法来做这件事,否则我看到不幸的是

;WITH CTE AS (
    SELECT
        ROW_NUMBER() OVER (ORDER BY [Date]) AS RowId,
        [Date],
        [Sales]
    FROM @T
)
    SELECT
        A.[Date],
        A.[Sales],
        SUM(B.[Sales]) AS [Total]
    FROM CTE A
        INNER JOIN CTE B
            ON B.RowId <= A.RowId
    GROUP BY
        A.[Date],
        A.[Sales]
    ORDER BY
        A.[Date]

加窗求和应可在多个DBMS上使用。下面是一个SQL Server示例,请告知您使用的是哪一个:

DECLARE @T TABLE ([Date] DATE, [Sales] INT)
INSERT @T VALUES ('1/1/2015', 100), ('2/1/2015', 150), ('3/1/2015', 500)

SELECT
    [Date],
    [Sales],
    SUM([Sales]) OVER (ORDER BY [Date]) AS [Total]
FROM @T
ORDER BY
    [Date]
这将生成以下输出:

Date       Sales       Total
---------- ----------- -----------
2015-01-01 100         100
2015-02-01 150         250
2015-03-01 500         750
由于SQL Server 2008仅从2012年起才在窗口聚合中支持ORDER BY,因此这里提供了一种方法来执行相同的操作。这是非常低效的-只是没有一个非常有效的方法来做这件事,否则我看到不幸的是

;WITH CTE AS (
    SELECT
        ROW_NUMBER() OVER (ORDER BY [Date]) AS RowId,
        [Date],
        [Sales]
    FROM @T
)
    SELECT
        A.[Date],
        A.[Sales],
        SUM(B.[Sales]) AS [Total]
    FROM CTE A
        INNER JOIN CTE B
            ON B.RowId <= A.RowId
    GROUP BY
        A.[Date],
        A.[Sales]
    ORDER BY
        A.[Date]

SQL表表示无序集。没有上一行或下一行,除非列显式表示排序。如果为此目的使用“日期”列,则限制为12行。也许你应该重新表述你的问题,用更接近你实际工作的数据。另外,请用您正在使用的数据库标记您的问题。大多数DBMS支持窗口聚合函数,您需要一个累积和:SUMsales OVER ORDER BY date ROWS UNBOUNDED preding哪个数据库提供程序?SQL Server?MySQL?SQLite?可能重复的SQL表表示无序集。没有上一行或下一行,除非列显式表示排序。如果为此目的使用“日期”列,则限制为12行。也许你应该重新表述你的问题,用更接近你实际工作的数据。另外,请用您正在使用的数据库标记您的问题。大多数DBMS支持窗口聚合函数,您需要一个累积和:SUMsales OVER ORDER BY date ROWS UNBOUNDED preding哪个数据库提供程序?SQL Server?MySQL?SQLite?可能重复,谢谢!我正在使用MSSQL 2008 R2,上面的代码不适用于我:-它不喜欢订单。我试着按分区。它运行,但不添加编号。直到2012年才支持ORDER BY。我在2008年用一种方法更新了答案。正如我所提到的,不幸的是,这不是一个好方法,但它是有效的。很高兴它做到了。如果您满意,请随时投票或接受答案。谢谢!我正在使用MSSQL 2008 R2,上面的代码不适用于我:-它不喜欢订单。我试着按分区。它运行,但不添加编号。直到2012年才支持ORDER BY。我在2008年用一种方法更新了答案。正如我所提到的,不幸的是,这不是一个好方法,但它是有效的。很高兴它做到了。如果您对答案满意,请随时投票或接受答案。