Sql 在计算的基础上,借方或贷方。如果我加的100比我们的600多,因为CreditAmountas贷记金额is3000而借记金额is2400对不起,我没有回答这个问题。在这种情况下,我可能会使用CTE方法,在CTE中只构建两个数值,一个期初余额和一个新交易的总

Sql 在计算的基础上,借方或贷方。如果我加的100比我们的600多,因为CreditAmountas贷记金额is3000而借记金额is2400对不起,我没有回答这个问题。在这种情况下,我可能会使用CTE方法,在CTE中只构建两个数值,一个期初余额和一个新交易的总,sql,sql-server,Sql,Sql Server,在计算的基础上,借方或贷方。如果我加的100比我们的600多,因为CreditAmountas贷记金额is3000而借记金额is2400对不起,我没有回答这个问题。在这种情况下,我可能会使用CTE方法,在CTE中只构建两个数值,一个期初余额和一个新交易的总和,然后让外部查询根据它们是正还是负将它们解释为借方余额或贷方余额。 CREATE TABLE Transactions ( ID INT, COATitle VARCHAR(35), ConfigurationCode INT, Debi


在计算的基础上,
借方
贷方
。如果我加的
100
比我们的
600
多,因为
CreditAmount
as
贷记金额
is
3000
借记金额
is
2400
对不起,我没有回答这个问题。在这种情况下,我可能会使用CTE方法,在CTE中只构建两个数值,一个期初余额和一个新交易的总和,然后让外部查询根据它们是正还是负将它们解释为借方余额或贷方余额。
CREATE TABLE Transactions
(
ID INT, 
COATitle VARCHAR(35),
ConfigurationCode INT, 
DebitAmount NUMERIC, 
CreditAmount NUMERIC,
TransactionDate Date
)

INSERT INTO Transactions VALUES (1, 'Sales', 24, '2400', NULL, '2018-08-24');
INSERT INTO Transactions VALUES (2, 'Items', 24, NULL, '1200', '2018-08-24');
INSERT INTO Transactions VALUES (3, 'Bank', 24, NULL, '1200', '2018-08-24');
INSERT INTO Transactions VALUES (4, 'Meezan', 24, '1500', NULL, '2018-08-25');
INSERT INTO Transactions VALUES (5, 'Items', 24, NULL, '1500', '2018-08-25');
INSERT INTO Transactions VALUES (6, 'Bank', 24, NULL, '1200', '2018-08-26');
INSERT INTO Transactions VALUES (7, 'Sales', 24, '5400', NULL, '2018-08-26');
INSERT INTO Transactions VALUES (8, 'Items', 24, NULL, '1200', '2018-08-26');
INSERT INTO Transactions VALUES (9, 'Bank', 24, NULL, '3000', '2018-08-26');
;WITH CTE AS (
    SELECT *
    FROM 
    Transactions

)
SELECT 
COATitle, SUM([D].[DebitAmount]) DrAmount, SUM([D].[CreditAmount]) CrAmount

FROM(
    SELECT *,
            SUM(ISNULL(NULLIF(DebitAmount, 0), 0)-ISNULL(NULLIF(CreditAmount, 0), 0)) OVER (PARTITION BY CONFIGURATIONCODE ORDER BY ID) as Amount
    FROM CTE
    WHERE [TransactionDate] BETWEEN CAST('Aug 25 2018 11:21AM' AS DATE) AND CAST('Aug 25 2018 11:21AM' AS DATE)

    )D

    GROUP BY COATitle
COATitle    DrAmount    CrAmount
Items       NULL        1500
Meezan      1500        NULL
COATitle    OpeningDebit  OpeningDebit  DrAmount  CrAmount  ClosingDebit  ClosingCredit  
Bank        0             0             NULL      1200      0             1200
Items       0             0             NULL      1200      0             1200
Sales       0             0             2400      NULL      2400             0
COATitle    OpeningDebit  OpeningCredit  DrAmount  CrAmount  ClosingDebit  ClosingCredit  
Bank        0             1200           NULL     4200      0             5400
Items       0             1200           NULL     2700      0             3900
Sales       0             0              5400     NULL      7800             0
Meezan      0             0              1500     NULL      1500             0
DECLARE @Date_Fr    DATE    = '2018-08-25',
        @Date_To    DATE    = '2018-08-25'

SELECT  t.COATitle, 
        OpeningDebit    = ISNULL(o.OpeningDebit, 0), 
        OpeningCredit   = ISNULL(o.OpeningCredit, 0),
        t.DrAmount, t.CrAmount,
        ClosingDebit    = ISNULL(o.OpeningDebit, 0) + t.DrAmount,
        ClosingCredit   = ISNULL(o.OpeningCredit, 0) + t.CrAmount
FROM    (
            SELECT  COATitle, 
                    DrAmount    = SUM(CASE WHEN [TransactionDate] >= @Date_Fr THEN DebitAmount ELSE 0 END), 
                    CrAmount    = SUM(CASE WHEN [TransactionDate] >= @Date_Fr THEN CreditAmount ELSE 0 END)
            FROM    Transactions t
            WHERE   [TransactionDate]       <= @Date_To
            GROUP BY COATitle
        ) t
        OUTER APPLY
        (
            SELECT  OpeningDebit    = SUM(DebitAmount), OpeningCredit = SUM(CreditAmount)
            FROM    Transactions x
            WHERE   x.COATitle  = t.COATitle
            AND     x.[TransactionDate] < @Date_Fr
        ) o
WHERE   o.OpeningDebit  IS NOT NULL
OR      o.OpeningCredit iS NOT NULL
DECLARE 
    @from date = '25-08-2018',
    @to date = '26-08-2018'
;

WITH Items (COATitle) AS (
    SELECT DISTINCT COATitle
    FROM dbo.[Transactions]
), OpeningBalance (COATitle, OpeningAmount) AS (
    SELECT COATitle, SUM(ISNULL(DebitAmount, 0)) - SUM(ISNULL(CreditAmount, 0))
    FROM dbo.[Transactions]
    WHERE TransactionDate < @from
    GROUP BY COATitle
), DebitCredit(COATitle, DebitAmount, CreditAmount)  AS (
    SELECT COATitle, SUM(ISNULL(DebitAmount, 0)), SUM(ISNULL(CreditAmount, 0))
    FROM dbo.[Transactions]
    WHERE (@from <= TransactionDate) AND (TransactionDate <= @to)
    GROUP BY COATitle
)
SELECT 
    i.COATitle,
    OpeningDebitAmount = (CASE WHEN SUM(ISNULL(ob.OpeningAmount, 0)) < 0 THEN 0 ELSE SUM(ISNULL(ob.OpeningAmount, 0)) END),
    OpeningCreditAmount = (CASE WHEN SUM(ISNULL(ob.OpeningAmount, 0)) < 0 THEN -SUM(ISNULL(ob.OpeningAmount, 0)) ELSE 0 END),
    DebitAmount = SUM(ISNULL(dc.DebitAmount, 0)), 
    CreditAmount = SUM(ISNULL(dc.CreditAmount, 0)),
    ClosingDebitAmount = (CASE WHEN SUM(ISNULL(ob.OpeningAmount,0)+ISNULL(dc.DebitAmount,0)-ISNULL(dc.CreditAmount, 0)) < 0 THEN 0 ELSE SUM(ISNULL(ob.OpeningAmount,0)+ISNULL(dc.DebitAmount,0)-ISNULL(dc.CreditAmount, 0)) END),
    ClosingCreditAmount = (CASE WHEN SUM(ISNULL(ob.OpeningAmount,0)+ISNULL(dc.DebitAmount,0)-ISNULL(dc.CreditAmount, 0)) < 0 THEN -SUM(ISNULL(ob.OpeningAmount,0)+ISNULL(dc.DebitAmount,0)-ISNULL(dc.CreditAmount, 0)) ELSE 0 END)
FROM Items i
LEFT JOIN OpeningBalance ob ON (i.COATitle = ob.COATitle)
LEFT JOIN DebitCredit dc ON (i.COATitle = dc.COATitle)
GROUP BY i.COATitle
declare @Transactions table
(
    ID int, 
    COATitle varchar(35),
    ConfigurationCode int, 
    DebitAmount money, 
    CreditAmount money,
    TransactionDate date
);

insert @Transactions values
    (1, 'Sales', 24, 2400, NULL, '20180824'),
    (2, 'Items', 24, NULL, 1200, '20180824'),
    (3, 'Bank', 24, NULL, 1200, '20180824'),
    (4, 'Meezan', 24, 1500, NULL, '20180825'),
    (5, 'Items', 24, NULL, 1500, '20180825'),
    (6, 'Bank', 24, NULL, 1200, '20180826'),
    (7, 'Sales', 24, 5400, NULL, '20180826'),
    (8, 'Items', 24, NULL, 1200, '20180826'),
    (9, 'Bank', 24, NULL, 3000, '20180826');
declare @BeginDate date = '20180801';
declare @EndDate date = '20180824';
with RawDataCTE as
(
    select
        T.COATitle,
        OpeningDebit = coalesce(sum(case when T.TransactionDate < @BeginDate then T.DebitAmount end), 0),
        OpeningCredit = coalesce(sum(case when T.TransactionDate < @BeginDate then T.CreditAmount end), 0),
        DrAmount = sum(case when T.TransactionDate between @BeginDate and @EndDate then T.DebitAmount end),
        CrAmount = sum(case when T.TransactionDate between @BeginDate and @EndDate then T.CreditAmount end)
    from
        @Transactions T
    group by
        T.COATitle
)
select
    R.COATitle,
    R.OpeningDebit,
    R.OpeningCredit,
    R.DrAmount,
    R.CrAmount,
    ClosingDebit = R.OpeningDebit + coalesce(R.DrAmount, 0),
    ClosingCredit = R.OpeningCredit + coalesce(R.CrAmount, 0)
from
    RawDataCTE R
where
    R.OpeningDebit > 0 or
    R.OpeningCredit > 0 or
    R.DrAmount > 0 or
    R.CrAmount > 0;
select
    T.COATitle,
    OpeningDebit = coalesce(sum(case when T.TransactionDate < @BeginDate then T.DebitAmount end), 0),
    OpeningCredit = coalesce(sum(case when T.TransactionDate < @BeginDate then T.CreditAmount end), 0),
    DrAmount = sum(case when T.TransactionDate between @BeginDate and @EndDate then T.DebitAmount end),
    CrAmount = sum(case when T.TransactionDate between @BeginDate and @EndDate then T.CreditAmount end),
    ClosingDebit = coalesce(sum(case when T.TransactionDate <= @EndDate then T.DebitAmount end), 0),
    ClosingCredit = coalesce(sum(case when T.TransactionDate <= @EndDate then T.CreditAmount end), 0)
from
    @Transactions T
group by
    T.COATitle
having
    sum(case when T.TransactionDate <= @EndDate and (T.DebitAmount > 0 or T.CreditAmount > 0) then 1 else 0 end) > 0;