sql - 如何进行查询以返回与表中每一行相关的行数据
问题描述
我有一些关于复式簿记的表格。
表 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 美元的信贷相关的股权)
如果我们想知道它,每次我们需要找到一些东西时,我们都需要花时间在它上面
查询需要搜索整个表并根据行的借方或贷方值找到与每一行相关的对面
如上图所示,在对面添加了 2 个新列 Account 和 Account ID 在对面
第一行是指与现金相关的权益,第二行是指与权益相关的现金。
解决方案
据我所知,您需要做的是加入两个具有相同 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* 表再次连接以访问您想要的数据,并且显然将您想要在结果中的那些表中的字段添加到您的选择字段。
推荐阅读
- c# - 我收到 OleDb 异常(无法更新。数据库或对象是只读的)。我正在尝试使用 c# 将 csv 文件插入到我的 mysql 数据库中
- canvas - (设置!(.-onload image)(fn []))不工作
- quarkus - 如何在另一个 DMN 中调用 DMN?
- ios - 在 dynamicLinks.handleUniversalLink(url) 的回调中接收 nil
- c++ - std::contiguous_iterator 有什么用?
- c++ - lambda前面的符号+是什么意思?
- jsf - 为什么 convertDateTime 不支持 Instant
- javascript - Cloud HTTPS 函数:返回一个 Promise 中的 Promise
- excel - 删除 Excel 工作表中重复行的宏不起作用
- javascript - 如何在 reactJS 中使用 Lodash 或 JS 在 JSON 中动态添加键值对?