sql - 从其他方面相同的行中添加总计

标签 sql excel ms-access

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

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

使用 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魔术会更容易吗?我想得到一个好的解决方案,而不是我认为的好的解决方案。

最佳答案

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

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 的包含列,因为它看起来不像您在所需的结果中拥有它。如果此描述列包含 boarding , bath等,并且宠物有多个不同的条目,那么每个不同的代码描述都有一个单独的行。

关于sql - 从其他方面相同的行中添加总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16257701/

相关文章:

mysql - 按 id 将两列求和到一个字段

php - SQL Server 2008 数据库 + PHP 中的 UTF-8

MySQL查询逻辑辅助

excel - CONCATENATE 在 Excel VBA 中不起作用

python - Pandas 在具有多种数据类型的系列中崩溃

.net - VBA 中 .NET 的 System.Convert 的替代方案

vb.net - 如何一次执行四个查询然后检查成功或失败?

python - Excel 到 SQL 并处理重复值

javascript - VBA动态网页抓取Excel

C# 数据库合并/复制