Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite:带结束余额的运行余额_Sqlite_Accounting - Fatal编程技术网

SQLite:带结束余额的运行余额

SQLite:带结束余额的运行余额,sqlite,accounting,Sqlite,Accounting,我的期末余额是5000美元。我需要创建一个流动余额,但调整第一行以显示期末余额,然后对其余余额求和,使其看起来像银行对账单。这是我的流动余额,但如何调整第1行,使其不显示第一行的总和,而是显示期末余额 with BalBefore as ( select * from transactions where ACCT_NAME = 'Real Solutions' ORDER BY DATE DESC ) select DATE, amount, '$' || pri

我的期末余额是5000美元。我需要创建一个流动余额,但调整第一行以显示期末余额,然后对其余余额求和,使其看起来像银行对账单。这是我的流动余额,但如何调整第1行,使其不显示第一行的总和,而是显示期末余额

with BalBefore as (
  select *
  from transactions
  where ACCT_NAME = 'Real Solutions'
  ORDER BY DATE DESC
)

select
  DATE,
  amount,
  '$' || printf("%.2f", sum(AMOUNT) over (order by ROW_ID)) as Balance
from BalBefore;
这给了我

DATE         AMOUNT     BALANCE
9/6/2019     -31.00     $-31.00      <- I need this balance to be replaced with $5000 and have the rest
9/4/2019      15.00     $-16.00         sum as normal.
9/4/2019      15.00     $-1.00
9/3/2019     -16.00     $-17.00

我读过很多其他的问题,但我找不到一个我能理解的问题,所以我想我会发布一个更简单的问题。

下面的问题并不简短,但使用,我希望逻辑是显而易见的。定义了多个相互引用的CTE,以使整个查询更具可读性。总的来说,目标只是添加一个期初余额记录,可以是:

/*
DROP TABLE IF EXISTS data;
CREATE temp TABLE data (
       id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
       date DATETIME  NOT NULL,
       amount NUMERIC NOT NULL
);   

INSERT INTO data
(date, amount)
VALUES
     ('2019-09-03', -16.00),
     ('2019-09-04',  15.00),
     ('2019-09-04',  15.00),
     ('2019-09-06', -31.00)
;
*/

WITH 
     initial_filter AS (
         SELECT id, date, amount
         FROM data
         --WHERE ACCT_NAME = 'Real Solutions'
     ),
     prepared AS (
         SELECT *
         FROM initial_filter
         UNION ALL
         SELECT 
            9223372036854775807 as id, --largest signed integer 
            (SELECT MAX(date) FROM initial_filter) AS FinalDate, 
            -(5000.00) --ending balance (negated for summing algorithm)
     ),
     running AS (
          SELECT
                id,
                date,
                amount,
                SUM(-amount) OVER 
                    (ORDER BY date DESC, id DESC 
                     RANGE UNBOUNDED PRECEDING 
                     EXCLUDE CURRENT ROW) AS balance
          FROM prepared
          ORDER BY date DESC, id DESC
     )
SELECT *
FROM running
WHERE id != 9223372036854775807
ORDER BY date DESC, id DESC;
这将产生以下结果

id  date         amount balance
4   2019-09-06  -31.00  5000
3   2019-09-04   15.00  5031
2   2019-09-04   15.00  5016
1   2019-09-03  -16.00  5001
更新:第一个查询未生成正确的余额。期初余额行和窗口功能(即OVER子句)已更新,以准确合计正确的金额。
注意:每一行的余额完全是根据前几行确定的,而不是根据当前行的金额,因为这是从期末余额向后计算的,而不是从前几行余额向前计算的。

最简单的方法是将交易表中的另一行作为第一条记录,其中包含期初余额。这样,就不必更改sql语句。另一种选择是将5000添加到您选择的金额中,但select语句仅对该特定帐户有效。发布您的预期结果。是否有方法使用查询在具有期初余额的实际数据之前插入一行。我将“$”| | printf%.2f,$5000+summantium作为余额,但这使得期初余额为4069。有没有办法得到第一行的数量?然后我可以用$5000-row1.amount替换代码about,那么余额将是$5000。我有10个帐户,但每个报告都将按帐户分别运行。为什么不发布预期结果以澄清您想要的内容?如果您不想在表中创建实际的初始行,应该只需要在其中的某个位置创建一个联合。我更改了我的主要问题,因为它的措辞错误。给我的是期末余额,而不是期初余额。谢谢,C·珀金斯。您的声明非常方便,因为我可以调整最后一次选择,甚至缩小我的结果范围,比如日期范围,您的总数非常准确。我将能够在许多报告中使用它。再次感谢。我对这个代码有问题。如果第一行id 4是偶数,它会将整个金额列从一个双精度列更改为一个整数列,因此不会超过小数。我运行上述代码的结果在金额列中给出-31,15,15,-16。没有男性。但是,如果第一个金额有一个十进制金额,则该列将保持为双精度。将代码从金额的数字更改为实数修复了示例,但我不确定在使用实时数据库时如何执行此操作。我的初始过滤器如下所示:初始过滤器为选择行ID、日期、金额、账户名称、描述、类别、来自账户名称=Real Solutions的交易的注释,其中金额是货币字段。我如何让SQLite在整个选择过程中遵守浮动,而不是根据第1行中的第一个金额来确定列类型?如果通过更改底部的SELECT*来选择行ID、日期、账户名称、描述、类别、注释、castAMOUNT和amount、BALANCE来解决此问题,请执行以下操作。你应该调整你的答案,使之成为真实的数量。没有必要因为问题不是特定于语言或工具而调整答案。这只是在sqlite中演示一种运行平衡技术。这样一个答案的全部要点是,您将根据自己的需要定制细节。