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

时间:2013-04-27 22:54:40

标签: 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

所以基本上如果petname和invseq在任何/所有invseqs中都相同,那么添加总量(Expr1)并使其成为一行。

我刚刚开始乱搞SQL和Access以获得这样的结果,我不确定从哪里开始。我可以在各种表格上提供更多信息(但它们都非常混乱,因为狗窝软件是为了处理它们而不是我)。

拥有WHERE date >是完全必要的,因为它大约有15K行,而我的电脑并不喜欢它。这将它降低到非常可用的~500。

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

1 个答案:

答案 0 :(得分: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等,并且宠物有多个不同的条目,那么您将为每个不同的代码说明分别拥有一行。