期初和期末余额为借方和贷方金额

时间:2018-07-09 06:43:09

标签: sql-server

我在一些人的帮助下编写了这种表结构和查询,它的工作原理非常完美。我想获得两个日期之间的期初和期末余额。我已注释了要获取日期的日期,如果运行该日期,请检查所需的预期输出,如下所示。

以下是结构和示例数据:

DROP TABLE [TransactionMaster];
DROP TABLE [VoucherType];

CREATE TABLE [VoucherType](
    [VoucherTypeCode] [tinyint] NOT NULL PRIMARY KEY,
    [FullName] [nvarchar](255) NOT NULL
);


INSERT INTO [VoucherType] VALUES (1, 'Cash Payment Voucher');
INSERT INTO [VoucherType] VALUES (2, 'Cash Receipt Voucher');
INSERT INTO [VoucherType] VALUES (3, 'Bank Payment Voucher');
INSERT INTO [VoucherType] VALUES (4, 'Bank Receipt Voucher');


CREATE TABLE [TransactionMaster](
    [ID] [bigint] NOT NULL PRIMARY KEY,
    [VoucherTypeCode] [tinyint] NOT NULL,
    [PayeeName] [varchar](255) NOT NULL,
    [TransactionDate] datetime,
    [RefNo] [nvarchar](50) NULL
    CONSTRAINT [FK_tbl_TransactionMaster_tbl_VoucherType] FOREIGN KEY([VoucherTypeCode])
    REFERENCES [VoucherType] ([VoucherTypeCode])
)



INSERT INTO [TransactionMaster] VALUES (1, 2, 'Asim', '2018-03-21', 'CRV-0001-LHR');
INSERT INTO [TransactionMaster] VALUES (2, 4, 'Ali', '2018-03-21', 'BRV-2421-KHI');
INSERT INTO [TransactionMaster] VALUES (3, 1, 'Erick', '2018-03-23', 'CPV-5435-ISL');
INSERT INTO [TransactionMaster] VALUES (4, 3, 'Asim', '2018-03-24', 'BPV-2345-CAN');
INSERT INTO [TransactionMaster] VALUES (5, 2, 'Mehboob', '2018-03-25', 'CRV-2976-PSH');
INSERT INTO [TransactionMaster] VALUES (6, 1, 'Erick', '2018-03-25', 'CPV-2323-KOH');
INSERT INTO [TransactionMaster] VALUES (7, 1, 'Feroze', '2018-03-21', 'CRV-0531-SRG');
INSERT INTO [TransactionMaster] VALUES (8, 3, 'Ali', '2018-03-21', 'BRV-2001-RWP');



CREATE TABLE TransactionDetail
(
ID NUMERIC NOT NULL PRIMARY KEY,
TransactionCode bigint,
DrAmount NUMERIC,
CrAmount NUMERIC
);

INSERT INTO TransactionDetail VALUES (1, 1, '2500', NULL);
INSERT INTO TransactionDetail VALUES (2, 1, NULL, '1500');
INSERT INTO TransactionDetail VALUES (3, 1, NULL, '1000');
INSERT INTO TransactionDetail VALUES (4, 2, '1150', NULL);
INSERT INTO TransactionDetail VALUES (5, 2, NULL, '1150');
INSERT INTO TransactionDetail VALUES (6, 3, '600', NULL);
INSERT INTO TransactionDetail VALUES (7, 3, '400', NULL);
INSERT INTO TransactionDetail VALUES (8, 3, '200', NULL);
INSERT INTO TransactionDetail VALUES (9, 3, NULL, '1200');
INSERT INTO TransactionDetail VALUES (10, 4, '1000', NULL);
INSERT INTO TransactionDetail VALUES (11, 4, NULL, '1000');
INSERT INTO TransactionDetail VALUES (12, 5, '2400', NULL);
INSERT INTO TransactionDetail VALUES (13, 5, NULL, '1200');
INSERT INTO TransactionDetail VALUES (14, 5, NULL, '1000');
INSERT INTO TransactionDetail VALUES (15, 5, NULL, '200');
INSERT INTO TransactionDetail VALUES (16, 6, '2900', NULL);
INSERT INTO TransactionDetail VALUES (17, 6, NULL, '2900');
INSERT INTO TransactionDetail VALUES (18, 7, '700', NULL);
INSERT INTO TransactionDetail VALUES (19, 7, '300', NULL);
INSERT INTO TransactionDetail VALUES (20, 7, '2100', NULL);
INSERT INTO TransactionDetail VALUES (21, 7, NULL, '3100');
INSERT INTO TransactionDetail VALUES (22, 8, '500', NULL);
INSERT INTO TransactionDetail VALUES (23, 8, NULL, '500');

这是查询

    with data1 as (
select a.id inid,a.VoucherTypeCode,PayeeName,MAX(c.DrAmount) InAmount,TransactionDate,RefNo,FullName from TransactionMaster a 
inner join  [VoucherType] b on a.VoucherTypeCode = b.VoucherTypeCode
inner join  TransactionDetail c on a.ID = c.TransactionCode
where a.VoucherTypeCode in (1,3)
GROUP BY a.id,a.VoucherTypeCode,PayeeName,TransactionDate,RefNo,FullName
),

data2 as (
select a.id outid,a.VoucherTypeCode,PayeeName,MAX(c.CrAmount) OutAmount,TransactionDate,RefNo,FullName from TransactionMaster a 
inner join  [VoucherType] b on a.VoucherTypeCode = b.VoucherTypeCode
inner join  TransactionDetail c on a.ID = c.TransactionCode
where a.VoucherTypeCode in (2,4)
GROUP BY a.id,a.VoucherTypeCode,PayeeName,TransactionDate,RefNo,FullName
)
select *,COALESCE(a.TransactionDate,b.TransactionDate) as FullDate from data1 a full join data2 b on inid = outid and a.TransactionDate = b.TransactionDate

--WHERE COALESCE(a.TransactionDate,b.TransactionDate) BETWEEN '2018-03-23 00:00:00.000' AND '2018-03-24 00:00:00.000'

order by FullDate

从日期检查中删除评论时,下面提供了预期的输出:

    inid                 VoucherTypeCode PayeeName                                                                                                                                                                                                                                                       InAmount                                TransactionDate         RefNo                                              FullName                                                                                                                                                                                                                                                        outid                VoucherTypeCode PayeeName                                                                                                                                                                                                                                                       OutAmount                               TransactionDate         RefNo                                              FullName                                                                                                                                                                                                                                                        FullDate                            Opening
-------------------- --------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------- ----------------------- -------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------- --------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------- ----------------------- -------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------
3                    1               Erick                                                                                                                                                                                                                                                           1200                                    2018-03-23 00:00:00.000 CPV-5435-ISL                                       Cash Payment Voucher                                                                                                                                                                                                                                            NULL                 NULL            NULL                                                                                                                                                                                                                                                            NULL                                    NULL                    NULL                                               NULL                                                                                                                                                                                                                                                            2018-03-23 00:00:00.000                 -50
4                    3               Asim                                                                                                                                                                                                                                                            1000                                    2018-03-24 00:00:00.000 BPV-2345-CAN                                       Bank Payment Voucher                                                                                                                                                                                                                                            NULL                 NULL            NULL                                                                                                                                                                                                                                                            NULL                                    NULL                    NULL                                               NULL                                                                                                                                                                                                                                                            2018-03-24 00:00:00.000                 1150

公式为(Opening+InAmount) - Out Amount将是Closing Balance,而Opening将是前一行Closing Balance。 因此,对于第一个记录,打开将为0,关闭将为3100,而对于第二个打开= 3100,将关闭3600,依此类推。

如果VoucherType为1或3,则我必须获得贷方金额CrAmount;如果VoucherType为2或4,则我需要获取借方金额DrAmount。

我之前曾问过这个问题,并且也获得了预期的输出,但是现在数据库结构有所改变,我在这里无法使用该逻辑。

1 个答案:

答案 0 :(得分:0)

基本上,它与我在您的其他线程中发布的上一个查询相同。 由于其他表TransactionDetail中的详细信息,您只需要从TransactionMaster对其进行INNER JOIN并执行SUM()。我没有验证Dr-Cr或Cr-Dr逻辑。请验证自己。

SELECT  t.*, v.FullName, o.Opening
FROM    [TransactionMaster] t
        INNER JOIN [VoucherType] v  on  t.VoucherTypeCode   = v.VoucherTypeCode
        OUTER APPLY
        (   
        SELECT  Opening = sum(case when m.[VoucherTypeCode] in (1, 3) 
                                   then - ISNULL(d.CrAmount, 0)
                                   else + ISNULL(d.CrAmount, 0)
                                   end)
        FROM    [TransactionMaster] m
                INNER JOIN [TransactionDetail] d    ON  m.ID    = d.TransactionCode
        WHERE   m.TransactionDate < t.TransactionDate
        ) o
WHERE   t.TransactionDate   BETWEEN '2018-03-23' AND '2018-03-24'
order by t.TransactionDate

编辑: 您不需要使用FULL JOIN来标识IN和OUT。只需使用以下CASE语句

SELECT  inID     = case when t.VoucherTypeCode in (1,3) then t.ID end,
        inAmount = case when t.VoucherTypeCode in (1,3) then a.Amount end,
        outID    = case when t.VoucherTypeCode in (2,4) then t.ID end,
        outAmount = case when t.VoucherTypeCode in (2,4) then a.Amount end,
        t.PayeeName, t.TransactionDate, t.RefNo, 
        v.FullName, Opening = isnull(o.Opening, 0)
FROM    [TransactionMaster] t
        INNER JOIN [VoucherType] v  on  t.VoucherTypeCode   = v.VoucherTypeCode
        CROSS APPLY
        (
        SELECT  Amount  = sum(case when m.[VoucherTypeCode] in (1, 3) 
                                           then -CrAmount
                                           else DrAmount
                                           end)
        FROM    [TransactionMaster] m
            INNER JOIN [TransactionDetail] d    ON  m.ID    = d.TransactionCode
        WHERE   m.ID    = t.ID
        ) a
        OUTER APPLY
        (   
        SELECT  Opening = sum(case when m.[VoucherTypeCode] in (1, 3) 
                                           then -CrAmount
                                           else DrAmount
                                           end)
        FROM    [TransactionMaster] m
            INNER JOIN [TransactionDetail] d    ON  m.ID    = d.TransactionCode
        WHERE   m.TransactionDate   < t.TransactionDate
        ) o
order by t.TransactionDate