首页 > 解决方案 > 如何进行查询以返回与表中每一行相关的行数据

问题描述

我有一些关于复式簿记的表格。

表 VoucherDetail 包含每个凭证的会计分录,其他表是 Accounts Group/Ledger/Definitive

这是表格的图表 当前结果

我试图获取条目的另一侧并将其显示在与条目借记/贷记金额匹配的自定义列中(参见图2)。

我做了一些谷歌搜索,什么也没找到。这是我到目前为止所做的查询(参考图1):

SELECT
    dbo.Vouchers.VoucherId,
    vd.VoucherDetailIndex AS ind,
    vd.Debit,
    vd.Credit,
    vd.Description,
    CONCAT ( ag.Name, '_', al.Name, '_', ad.Name ) AS names,
    CONCAT ( ag.GroupId, '_', al.LedgerId, '_', ad.DefinitiveId ) AS ids 

FROM dbo.Vouchers

    JOIN dbo.VoucherDetails AS vd ON vd.Voucher_VoucherIndex = dbo.Vouchers.VoucherIndex
    JOIN dbo.AccDefinitives AS ad ON vd.AccDefinitive_DefinitiveIndex = ad.DefinitiveIndex
    JOIN dbo.AccLedgers AS al ON ad.AccLedger_LedgerIndex = al.LedgerIndex
    JOIN dbo.AccGroups AS ag ON al.AccGroup_GroupIndex = ag.GroupIndex

这是我得到的结果:

当前结果

结果我想成为:

期望的结果

这是一个解释我需要的示例:事件:我们将 10 美元作为我们的资产存入银行,现在我们需要为此创建一个凭证:

INSERT INTO Vouchers(VoucherIndex, VoucherId, VoucherDate, Description) VALUES
(1, 1, 2019/01/01, initial investment);

现在我们需要将此事件的条目添加到凭证 1 的 VoucherDetail 中,该凭证将有 2 个条目;1 现金和 1 股票:

INSERT INTO VoucherDetails(VoucherDetailIndex, Debit, Credit, Description AccDefinitive_DefinitiveIndex, AccLedger_LedgerIndex, Voucher_VoucherIndex, EntityOrder) VALUES
(1, 10$, 0, 'Put Cash on Bank as initial Investment', 10101, 101, 1, 1),
(2, 0, 10$, 'initial Investment', 50101, 501, 1, 2);

现在我们运行我在这里提供的第一个查询是结果

当前结果

现在我们有了共同的结果,让我们来解决问题

想象有人用 10000 行数据填充这些表

我们需要找到 Voucher no.10,在 VoucherDetail 中有 20 个条目,我们通过简单的查询得到这些条目。

但我们不知道哪个与哪个相关(如上面的示例现金与 10 美元的债务与 10 美元的信贷相关的股权)

如果我们想知道它,每次我们需要找到一些东西时,我们都需要花时间在它上面

查询需要搜索整个表并根据行的借方或贷方值找到与每一行相关的对面

这应该是我在 excel 中写的结果: 当前结果

如上图所示,在对面添加了 2 个新列 Account 和 Account ID 在对面

第一行是指与现金相关的权益,第二行是指与权益相关的现金。

标签: sql

解决方案


据我所知,您需要做的是加入两个具有相同 Voucher_VoucherIndex 值的 VoucherDetail 记录(为简洁起见,我们称之为 VoucherID)。但是,这些记录仅有的两个共同点是它们的 VoucherID 以及借方值 = 另一个中的贷方值这一事实,反之亦然。

在您提到的评论中,具有相同 VoucherID 的多个 VoucherDetail 行可以具有相同的借方值(我假设贷方值)。如果不是这种情况,您可以在查询中添加类似这样的内容:

    JOIN dbo.VoucherDetails AS vd_opposite
        ON vd.Voucher_VoucherIndex = vd_opposite.Voucher_VoucherIndex
        AND (vd.Debit = vd_opposite.Credit OR vd.Credit = vd_opposite.Debit)

但是您不能这样做,因为借记卡/贷记卡和 VoucherID 一起不足以成为唯一的,因此您可能会在连接中选择您不想要的额外行。

因此,您唯一的选择是在您的表中添加一个新的 ID 字段(可能称为 SaleID 或其他名称),该字段明确地将表示同一“销售”相对两侧的两行与一个公共 ID 联系起来。然后,上面的 JOIN 将如下所示:

    JOIN dbo.VoucherDetails AS vd_opposite
        ON vd.Voucher_VoucherIndex = vd_opposite.Voucher_VoucherIndex
        AND vd.SaleID = vd_opposite.SaleID

除了添加该 JOIN 之外,您还需要将新vd_opposite表与所有 dbo.Acc* 表再次连接以访问您想要的数据,并且显然将您想要在结果中的那些表中的字段添加到您的选择字段。


推荐阅读