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:创建始终返回值的选择查询的主要内容,如果未能解决你的问题,请参考以下文章

始终返回相同布尔值的 Python 函数

如何编写一个从 ACCESS 数据库返回值的 Excel 函数?

返回带有零而不是空值的 Access 记录集

如何从 Access 2010 中的 SQL 存储过程返回多个记录集

C#,winfom,数据库为access.如何把sql查询结果直接保存在数组中?不是通过循环一个值一个值的赋予。

Amazon athena 无法读取 S3 Access 日志文件,Athena 选择查询为每一列返回空结果集