MC Access:创建始终返回值的选择查询
Posted
技术标签:
【中文标题】MC Access:创建始终返回值的选择查询【英文标题】:MC Access: Create Select query that always returns value 【发布时间】:2016-09-02 09:09:37 【问题描述】:美好的一天!我希望有一个人可以帮助我。下面我写下了我的结构和问题。 我有这张发票明细表: 发票明细表
Invoice | Detail | Product | Price | VAT % | VAT € | TOTAL |
------- | -------|---------|-------|-------|-------|-------|
0001 | 1 | X | € 100 | 21 | € 21 | € 121 |
0001 | 2 | X | € 200 | 21 | € 42 | € 242 |
0001 | 3 | X | € 100 | 6 | € 6 | € 106 |
现在我想进行选择查询以获取以下值:
想要的查询结果:
Invoice | SumofVAT 6% | SumofVAT 21% |
------- | ------------|--------------|
0001 | €6 | € 63 |
在此查询之后,我可以使用更新查询将此数据写入我的发票表:
Invoice | Client | Date | Price | VAT 6% | VAT 21% |
------- | -------|---------|-------|--------|---------|
0001 | B10 |01-01-01 | € 469 | € 6 | € 63 |
我尝试了很多东西。我遇到的问题是,当一个特定的产品只有一种或多种产品,其中一种增值税为 %。然后查询返回 Null。
我想我应该有:
1) 计算发票 xxxx 的总增值税 6% 的查询(返回发票编号和 6% 的总增值税)
2) 计算发票 xxxx 的总增值税 21% 的查询(返回发票编号和 21% 的总增值税)
3) 如果这些查询之一返回 Null,则应返回发票编号和增值税总额 0,00 欧元
希望有人可以帮助我。
6% QUERY 的图片:(21% 相等,但条件为“21”)
SQL 版本:
SELECT FactuurDetails.Factuurnummer, FactuurDetails.[BTW in %],Sum(FactuurDetails.[BTW in EURO]) AS [SumOfBTW in EURO]
FROM FactuurDetails
GROUP BY FactuurDetails.Factuurnummer, FactuurDetails.[BTW in %]
HAVING (((FactuurDetails.Factuurnummer)=[Forms]![Facturen]!
在这里您可以看到如果发票中只有 21%(或相反)的产品,则查询结果将为空。
【问题讨论】:
分享您尝试获得上述结果的查询。 将您的查询分享为文本代码 plz 我们需要您查询的 SQL 版本才能为您提供帮助 将这些内容写入 Invoices 表是错误的。它违反了规范化的关系设计原则,并引入了传递依赖。除非你有客观的理由去规范化,否则不要这样做。 【参考方案1】:肯定不是您期望的答案,我会收到一些反对票,但让我们开始吧:将这些内容写入您的 Invoices 表是错误的:它违反了规范化的关系设计原则, 并引入了传递依赖。
除非你有客观的理由去规范化,否则不要这样做。
此外,如果设计正确,您的 Invoice 记录必须在 InvoiceDetails 之前创建,否则您无法实现参照完整性。
我强烈建议您阅读更多关于relational database design and normalization 的信息。
作为一个非常简化的规则:不要存储可以重新计算的内容,除非您出于历史原因需要它(但在这里您将税收历史记录保留在详细信息中)
要计算您的增值税总额,您可以这样做:
SELECT Invoices.Id, Details.VatRate, Sum([Quant]*[unitprice]*[VatRate]) AS VatAmount
FROM Invoices LEFT JOIN Details ON Invoices.Id = Details.InvId
GROUP BY Invoices.Id, Details.VatRate;
或使用交叉表查询:
TRANSFORM Sum([Quant]*[unitprice]*[VatRate]) AS VatAmount
SELECT Invoices.Id
FROM Invoices LEFT JOIN Details ON Invoices.Id = Details.InvId
GROUP BY Invoices.Id
PIVOT Details.VatRate;
【讨论】:
我了解,但我的发票记录是在 invoicedetails 之前创建的。只有增值税需要更新,因为当有人出于某种原因更改发票中的产品金额时,我的发票详细信息记录会创建这些。因此,添加到发票记录中的唯一数据是欧元的增值税金额。其余的已经在那里了。 没关系。但是,如果您的增值税总额没有存储在订单上,而是计算出来,则不需要更新。 它们被存储。但作为总量并没有分开 6% 和 21%。为了给我们的财务女士制作一张易于阅读的表格,我希望将其分开。 对于财务女士,您可以创建一个 QUERY 或 Excel 表,从 Access db 中提取数据。最终布局(几乎)永远不会决定数据库的结构!!! 我明白这一点,你是对的。但我希望你能帮助我如何创建如上所述的单独 BTW 总和的查询。别介意我提到的更新声明。如果我可以查询显示某张发票的 6% 和 21% 的总和,我会非常高兴。【参考方案2】:你可以试试这个。我自己测试过,我认为它可以为您带来预期的结果。
SELECT I1 AS Invoice, six.t AS VAT_6, twentyone.t AS VAT_21
FROM
(SELECT Invoice AS I1, IIF(ISNULL(sum(VAT)),0,sum(VAT)) AS t
FROM Table1 WHERE [vat%] = 6 GROUP BY Invoice) AS six
RIGHT JOIN
(SELECT Invoice AS I2, IIF(ISNULL(sum(VAT)),0,sum(VAT)) AS t
FROM Table1 WHERE [vat%] = 21 GROUP BY Invoice) AS twentyone ON six.I1 = twentyone.I2
UNION
SELECT I1 AS Invoice, six.t AS VAT_6, twentyone.t AS VAT_21
FROM
(SELECT Invoice AS I1, IIF(ISNULL(sum(VAT)),0,sum(VAT)) AS t
FROM Table1 WHERE [vat%] = 6 GROUP BY Invoice) AS six
LEFT JOIN
(SELECT Invoice AS I2, IIF(ISNULL(sum(VAT)),0,sum(VAT)) AS t
FROM Table1 WHERE [vat%] = 21 GROUP BY Invoice) AS twentyone ON six.I1 = twentyone.I2
我不知道这样做是否是正确的做法,但就我而言,它做了上面描述的应该做的事情。
编辑:这是我根据您的示例创建的数据表 并将结果作为屏幕截图
表格
结果
【讨论】:
为什么不用交叉表?这确实可能非常缓慢。 是的,如果你有一个非常大的数据库,它可能会很慢(我怀疑是这种情况——如果你有大/复杂的数据库,你就不要使用 MS Access)。但是查询本身是尽可能简单的。在不使用任何“特殊”的情况下,它会执行预期的操作。它既不漂亮也不优雅,但它确实有效。 Access 是一个 RAD 工具,数据库可以是任何东西。 我会告诉你,数据库可以是任何东西(尽管我仍然认为他不会有性能问题)。事实仍然是,这是您可以正确完成工作的最简单的查询。编辑:最简单的意思是不使用交叉表和枢轴【参考方案3】:要对可能包含 Null 的值求和,您只需替换:
[Value_that_may_be_Null]
和 Nz([Value_that_may_be_Null],0)
在您的查询中(在图形查询设计器和 Access SQL 中工作)
【讨论】:
以上是关于MC Access:创建始终返回值的选择查询的主要内容,如果未能解决你的问题,请参考以下文章
如何编写一个从 ACCESS 数据库返回值的 Excel 函数?
如何从 Access 2010 中的 SQL 存储过程返回多个记录集