sql - 使用初始值运行总计,然后添加日期规定的总计

标签 sql sql-server-2005

假设我们有一张 table :

SELECT SUM(A) AS TOTALS,DATE,STUFF FROM TABLE WHERE DATE BETWEEN 'DATESTART' AND 'DATEEND'
GROUP BY DATE,STUFF

通常,这得到的总数为:

totals stuff    date
23      x      01.01.1900
3       x      02.01.1900
44      x      06.01.1900

但是,如果我们在开始日期之前有先前的数据,并且我想将这些初始数据添加到我的开始日期值中,该怎么办?例如;从一开始我就已经有了 x 的总和值,比如说 100 所以我希望我的表从 123 开始并添加以前的数据,例如: 123 126 126+44等等...

totals stuff    date
123      x      01.01.1900
126      x      02.01.1900
170      x      06.01.1900

我怎样才能做到这一点?

源数据:

WITH    Stocks
          AS (
               SELECT
                Dep.Dept_No ,
                SUM(DSL.Metre) AS Metre ,
                CONVERT(VARCHAR(10), Date, 112) AS Date
               FROM
                DS (NOLOCK) DSL
                JOIN TBL_Depts (NOLOCK) Dep ON Dep.Dept_No = DSL.Dept
               WHERE
                1 = 1 AND
                DSL.Sil = 0 AND
                DSL.Depo IN ( 5000, 5001, 5002, 5003, 5004, 5014, 5018, 5021, 5101, 5109, 5303 ) AND
                Dep.Dept_No NOT IN ( 6002 ) AND
                Dep.Dept_No IN ( 6000, 6001, 6003, 6004, 6005, 6011, 6024, 6030 ) AND
                DSL.Date BETWEEN '2013-06-19' AND '2013-06-20'
               GROUP BY
                Dep.Dept_No ,
                CONVERT(VARCHAR(10), Date, 112)
             )
    SELECT
        Stocks.Metre ,
        Dep.Dept AS Dept ,
        Stocks.Date
    FROM
        Stocks
        LEFT JOIN TBL_Depts (NOLOCK) Dep ON Stocks.Dept = Dep.Dept
    ORDER BY
        Stocks.Metre DESC

最佳答案

任何具有窗口和分析功能的 RDBMS(SQL Server 2012、PostgreSQL,但不是 MySQL)

SELECT
    SumA + SUM(SumARange) OVER (ORDER BY aDate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS TOTALS,
    other, aDate
FROM
    (
    SELECT
        SUM(a) AS SumARange,
        other, aDate
    FROM
        SomeTable
    WHERE
        aDate BETWEEN '20130101' AND '20130106'
    GROUP BY
        other, aDate
    ) X
    CROSS JOIN
    (
    SELECT
        SUM(a) AS SumA
    FROM
        SomeTable
    WHERE
        aDate < '20130101'
    ) Y
ORDER BY
    aDate;

SELECT
    SUM(SumA) OVER () + SUM(SumARange) OVER (ORDER BY aDate ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS TOTALS,
    other, aDate
FROM
    (
    SELECT
        SUM(CASE WHEN aDate < '20130101' THEN a ELSE 0 END) AS SumA,
        SUM(CASE WHEN aDate BETWEEN '20130101' AND '20130106' THEN a ELSE 0 END) AS SumARange,
        other, aDate
    FROM
        SomeTable
    WHERE
        aDate <= '20130106'
    GROUP BY
        other, aDate
    ) X
ORDER BY
    aDate;

SQLFiddle exampleanother

关于sql - 使用初始值运行总计,然后添加日期规定的总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17213896/

相关文章:

mysql - 在 MySQL 中插入时从两个表中选择相同的列

sql-server - SQL Server ORDER BY 日期和最后的空值

sql - 插入使用值

.net - 基数估计问题?日期时间参数与强制转换?

c# - 获取刚刚插入的记录的 ID?

mysql - 错误1005(HY000): Can't create table 'shrewd_db.alert_disable_register' (errno: 150)

sql - 在同一张表上使用 postgis 几何编写 SQL 查询

sql - 滚动平均postgres

php - sql select如何调用函数?

sql-server-2005 - 在 SQL Server 2005 中透视表以多次包含相同的列