从SQL结果中,不需要一些凭证

时间:2018-03-16 11:29:04

标签: sql-server

我需要从桌子上拿到分类帐。它的工作,但它挑选了一些我不需要的行,我怎么能放下这些行。

这是详细的场景 我在表格中有以下行

I have the following rows

当我执行语句select * from MyTable where AccountCode=1001

我给了我以下几行。

It gives the following rows

根据SQL语句结果很好,但是我不需要结果中具有黄色背景的行,因为它具有相同的借方和贷方帐户代码和金额。

所以我需要从具有相同帐户代码和金额的结果中删除PV凭证。

请帮我解决。

这是DDL

CREATE TABLE [dbo].[MyEntries](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [AccountCode] [int] NULL,
    [Voucher] [nvarchar](50) NULL,
    [Description] [nvarchar](50) NULL,
    [Dr] [real] NULL,
    [Cr] [real] NULL
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[MyEntries] ON
INSERT [dbo].[MyEntries] ([Id], [AccountCode], [Voucher], [Description], [Dr], [Cr]) VALUES (1, 1001, N'R.10001', N'some desc', 100, 0)
INSERT [dbo].[MyEntries] ([Id], [AccountCode], [Voucher], [Description], [Dr], [Cr]) VALUES (2, 1005, N'R.10001', N'some desc', 0, 100)
INSERT [dbo].[MyEntries] ([Id], [AccountCode], [Voucher], [Description], [Dr], [Cr]) VALUES (3, 1001, N'PV.2587', N'some desc', 500, 0)
INSERT [dbo].[MyEntries] ([Id], [AccountCode], [Voucher], [Description], [Dr], [Cr]) VALUES (4, 1001, N'PV.2587', N'some desc', 0, 500)
INSERT [dbo].[MyEntries] ([Id], [AccountCode], [Voucher], [Description], [Dr], [Cr]) VALUES (5, 5002, N'B.12584', N'some desc', 200, 0)
INSERT [dbo].[MyEntries] ([Id], [AccountCode], [Voucher], [Description], [Dr], [Cr]) VALUES (6, 1001, N'B.12584', N'some desc', 0, 200)
INSERT [dbo].[MyEntries] ([Id], [AccountCode], [Voucher], [Description], [Dr], [Cr]) VALUES (7, 1001, N'PV.2587', N'some desc', 500, 0)
INSERT [dbo].[MyEntries] ([Id], [AccountCode], [Voucher], [Description], [Dr], [Cr]) VALUES (8, 1003, N'PV.2587', N'some desc', 0, 500)
SET IDENTITY_INSERT [dbo].[MyEntries] OFF

1 个答案:

答案 0 :(得分:4)

我们可以尝试使用SUM作为帐户代码和凭证分区的窗口功能。然后,我们可以保留信用/借记差异不为零的记录。

SELECT
    [Account Code], Voucher, Description, Debit, Credit
FROM
(
    SELECT *,
        SUM(COALESCE(Credit, 0) - COALESECE(Debit, 0)) OVER (
            PARTITION BY [Account Code], [Voucher]) AS running_sum
    FROM yourTable
) t
WHERE running_sum <> 0;