【问题标题】:How to make ledger query using SELECT statement in SQL如何在 SQL 中使用 SELECT 语句进行分类帐查询
【发布时间】:2020-01-25 05:31:01
【问题描述】:
DECLARE @AccountId int = 1152; 
DECLARE @StartDate datetime = '10/1/2019';
DECLARE @EndDate datetime = '1/25/2020';

DECLARE @PreBalance int = (SELECT ISNULL(SUM(Debit), 0) - ISNULL(SUM(Credit), 0) 
                           FROM GL_Voucher m 
                           INNER JOIN GL_Voucher_Item_Type d ON m.Id = d.GL_Voucher_Id
                           WHERE m.Date < @StartDate
                             AND d.L5_Id = @AccountId)

SELECT d.Date, d.debit AS Debit, d.Credit, @PreBalance AS Opening
FROM GL_Voucher_Item_Type d 
INNER JOIN GL_Voucher m ON d.GL_Voucher_Id = m.Id
INNER JOIN Level5 a ON d.L5_Id = a.Id
INNER JOIN Level4 l4 ON a.L4_Id = l4.Id
INNER JOIN Level3 l3 ON l4.L3_id = l3.Id
INNER JOIN Level2 l2 ON l3.L2_id = l2.Id
INNER JOIN Level1 l1 ON l2.L1_id = l1.Id
WHERE m.Date BETWEEN @StartDate AND @EndDate 
  AND d.L5_Id = @AccountId
ORDER BY Date ASC

This is the output of query

我想首先将余额列显示为 Balance=@Prebalance tehn,如果贷方则 Balance=Balance-Credit,如果借方则 Balance=Balance+Debit

【问题讨论】:

  • 这可以做到,但是是非常特定于产品的。请edit您的帖子并标记您正在使用的特定数据库。 Why should I tag my RDBMS?
  • @EricBrandt MS SQL

标签: sql sql-server


【解决方案1】:

我会使用SUM OVER 计算借方和贷方的运行总计,然后进行数学运算。

这是未经测试的,但应该非常接近您正在寻找的内容。

SELECT d.DATE
    ,d.debit AS Debit
    ,d.Credit
    ,@PreBalance 
     - SUM(d.debit) OVER (ORDER BY d.DATE) + SUM(d.Credit) OVER (ORDER BY d.DATE)
     AS Opening
FROM GL_Voucher_Item_Type d
INNER JOIN GL_Voucher m ON d.GL_Voucher_Id = m.Id
INNER JOIN Level5 a ON d.L5_Id = a.Id
INNER JOIN Level4 l4 ON a.L4_Id = l4.Id
INNER JOIN Level3 l3 ON l4.L3_id = l3.Id
INNER JOIN Level2 l2 ON l3.L2_id = l2.Id
INNER JOIN Level1 l1 ON l2.L1_id = l1.Id
WHERE m.DATE BETWEEN @StartDate
        AND @EndDate
    AND d.L5_Id = @AccountId
ORDER BY DATE ASC

【讨论】:

    【解决方案2】:

    请试试这个:

    select d.Date,@PreBalance as Balance,
    case when d.Credit > 0 THEN @PreBalance - d.Credit 
         else debit+@PreBalance end as CreditOrDebitBalance
    from GL_Voucher_Item_Type d 
    INNER JOIN GL_Voucher m ON d.GL_Voucher_Id=m.Id
    INNER JOIN Level5 a ON d.L5_Id=a.Id
    INNER JOIN Level4 l4 ON a.L4_Id=l4.Id
    INNER JOIN Level3 l3 ON l4.L3_id=l3.Id
    INNER JOIN Level2 l2 ON l3.L2_id=l2.Id
    INNER JOIN Level1 l1 ON l2.L1_id=l1.Id
    WHERE m.Date BETWEEN @StartDate AND @EndDate 
    AND d.L5_Id=@AccountId
    ORDER BY Date ASC
    

    请向我们展示预期的输出,以便我们进一步提供帮助。

    【讨论】:

    • 消息 102,级别 15,状态 1,第 14 行“@CreditOrDebitBalance”附近的语法不正确。
    • 糟糕!它的错字。 CreditOrDebitBalance 前面不应该有@。我更新了我的答案。请检查。
    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 2011-12-09
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2023-02-03
    相关资源
    最近更新 更多