1

我正在处理一个查询,以简化我在寄宿处的发票历史记录(以及我比较收据)。

我没有手动操作,而是从软件制作的数据库中抓取数据。我认为我有一个很好的开始,但我遇到了一些问题。

使用 Microsoft Access,我在几个包含所有信息的表之间添加了一些关系(使用 INNER JOINS),并且我有一个如下 SQL 语句:

SELECT 
  Invoices.InDate, 
  Pets.PtPetName, 
  [IIQuantity]*[IIEach] AS Expr1, 
  Clients.CLLastName, 
  InvoiceItems.IIItemCodeDesc, 
  Invoices.InSeq
FROM 
  (((Clients INNER JOIN Pets ON Clients.CLSeq = Pets.PtOwnerCode) 
INNER JOIN 
  Invoices ON Clients.CLSeq = Invoices.InClientSeq) 
INNER JOIN 
  InvoiceItems ON (Invoices.InSeq = InvoiceItems.IIInvSeq) 
               AND (Pets.PtSeq = InvoiceItems.IIPetSequence)) 
INNER JOIN 
  Inventory ON InvoiceItems.IIItemCode = Inventory.InvSeq
WHERE 
  (((Invoices.InDate)>#12/31/2012#))
ORDER BY 
  Invoices.InSeq;

这给了我类似的东西:

  DATE   | NAME | TOTAL | LNAME | INVSEQ
----------------------------------------
1/1/2013 | ODIE |   15  | SMITH | 12344
1/1/2013 | ODIE |   60  | SMITH | 12344
1/1/2013 | YODA |   10  | QWERT | 12345
1/1/2013 | YODA |   25  | QWERT | 12345
1/1/2013 | YODA |   80  | QWERT | 12345
1/1/2013 | C3PO |   10  | QWERT | 12345
1/1/2013 | C3PO |   80  | QWERT | 12345

在这种情况下,发生这种情况是因为 ODIE 洗澡和登机,而 YODA 洗澡、登机等等,而 C3PO 只是洗澡和登机。

我想要的是:

  DATE   | NAME | TOTAL | LNAME | INVSEQ
----------------------------------------
1/1/2013 | ODIE |   75  | SMITH | 12344
1/1/2013 | YODA |  115  | QWERT | 12345
1/1/2013 | C3PO |   90  | QWERT | 12345

因此,基本上,如果任何/所有 invseq 中的 petname 和 invseq 相同,则将总金额 (Expr1) 相加并使其成为一行。

我刚刚开始使用 SQL 和 Access 来解决这样的问题,但我不确定从哪里开始。我可以提供有关各种表格的更多信息(但它们都非常混乱,因为狗窝软件是用来处理它们的,而不是我)。

完全有必要拥有它,WHERE date >因为它大约有 15K 行,而我的计算机不喜欢这样。这将其减少到非常有用的〜500。

导出到excel并做一些excel魔术会更容易吗?我想得到一个好的解决方案,而不是我认为的好的解决方案。

4

1 回答 1

3

听起来您肯定只是想使用聚合函数sum()来获取total每只宠物的值。

SELECT 
  Invoices.InDate, 
  Pets.PtPetName, 
  SUM([IIQuantity]*[IIEach]) AS Total, 
  Clients.CLLastName, 
  Invoices.InSeq
FROM 
  (((Clients INNER JOIN Pets ON Clients.CLSeq = Pets.PtOwnerCode) 
INNER JOIN 
  Invoices ON Clients.CLSeq = Invoices.InClientSeq) 
INNER JOIN 
  InvoiceItems ON (Invoices.InSeq = InvoiceItems.IIInvSeq) 
               AND (Pets.PtSeq = InvoiceItems.IIPetSequence)) 
INNER JOIN 
  Inventory ON InvoiceItems.IIItemCode = Inventory.InvSeq
WHERE (((Invoices.InDate)>#12/31/2012#))
GROUP BY Invoices.InDate, 
  Pets.PtPetName, 
  Clients.CLLastName, 
  Invoices.InSeq
ORDER BY  Invoices.InSeq;

您会注意到,一旦添加了聚合函数,就会添加一个GROUP BY子句。我删除了该InvoiceItems.IIItemCodeDesc列的包含,因为它看起来不像您在期望的结果中拥有它。如果此描述列包含boardingbath等,并且宠物有多个不同的条目,那么您将为这些不同的代码描述中的每一个都有一个单独的行。

于 2013-04-27T23:13:32.663 回答