在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年用一种方法更新了答案。正如我所提到的,不幸的是,这不是一个好方法,但它是有效的。很高兴它做到了。如果您对答案满意,请随时投票或接受答案。