【问题标题】:How to calculate balance along opening balance in SQL如何在SQL中沿期初余额计算余额
【发布时间】:2021-05-09 23:16:33
【问题描述】:

谁能帮我写一个 SQL 查询来找到顶部的余额?

期望的输出:

它目前不显示“期初余额”,但我也想要它。

这里是示例数据:

create database test

use test


CREATE TABLE [dbo].[tbl_Ledger]
(
    [Ledg_ID] [int] Primary Key IDENTITY(1,1) NOT NULL,
    [Ledg_p_ID] [int] NULL,
    [Ledg_Pay_ID] [int] NULL,
    [Ledg_FarmerID] [int] NOT NULL,
    [Ledg_Date] [date] NOT NULL,
    [Ledg_Desc] [varchar](255) NULL,
    [Ledg_Debit] [money] NOT NULL,
    [Ledg_Credit] [money] NOT NULL,
    [Ledg_Remarks] [varchar](255) NULL
)

INSERT INTO [dbo].[tbl_Ledger] ([Ledg_p_ID], [Ledg_Pay_ID], [Ledg_FarmerID],[Ledg_Date],
                                [Ledg_Desc], [Ledg_Debit], [Ledg_Credit],[Ledg_Remarks])
VALUES (1, NULL, 2, '2021-05-06',
        'Purchase', 500, 0.00, ''),
       (NULL, 2, 2, '2021-05-07',
        'Payment', 0.00, 300, ''),
       (NULL, 3, 2, '2021-05-08',
        'Payment', 0.00, 200, '')

【问题讨论】:

  • “期初余额在上”是什么意思?这似乎与您想要的结果无关。
  • 期初余额是指,从开始日期算起的前一个日期的余额。假设,我已请求 10-05-2021 至 15-05-2021,那么 09-05-2021 的余额将是我的期初余额

标签: sql database accounting


【解决方案1】:

这可能取决于您使用的数据库的供应商,但许多支持 OVER 子句。 见解释here:

使用 OVER 可以创建列的累积总和。 因此您的查询将如下所示:

SELECT ID, p_ID, FarmerID, Datee, Description, Debit, Credit,
SUM (Debit - Credit) OVER (ORDER BY Datee) AS Balance
FROM tbl_Ledger

【讨论】:

  • Imbar,您是对的,但如果我们在同一日期有超过 1 个条目。那么它在计算余额时会产生问题
【解决方案2】:

如果您想要每一行的“期初”余额,只需减去该行发生的情况:

SELECT l.*,
       SUM(Debit - Credit) OVER (ORDER BY Datee) AS Balance
       SUM(Debit - Credit) OVER (ORDER BY Datee) - (Debit - Credit) AS Opening_Balance
FROM tbl_Ledger l

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多