2013-04-27 49 views
1

我正在處理一個查詢,該查詢將簡化我在寄宿舍的發票歷史記錄(以及比較收據)。從其他方面相同的行中添加合計

而不是手動完成它,我正在從數據庫中抓取數據庫中的數據。我認爲我有一個非常好的開始,但我有一個問題。

使用Microsoft Access,我添加了具有所有信息幾張桌子之間的一些關係(它使用內部連接),我有一個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,加起來的總額(表達式1),並使其一行。

我剛剛開始搞亂SQL和Access來解決這個問題,我真的不知道從哪裏開始。我可以在各種表格上給出更多的信息(但它們都非常混亂,因爲狗窩軟件是用來處理它們的,而不是我)。

完全有必要擁有WHERE date >,因爲它大約有15K行,我的電腦不喜歡那樣。這削減到一個非常有用的〜500。

出口到excel會不會更容易一些,並且做一些優秀的魔法呢?我想得到一個好的解決方案,並不特別是我認爲會是一個好的解決方案。

回答

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列,因爲它看起來並不像您期望的結果。如果此說明欄包含boarding,bath等,並且寵物有多個不同的條目,那麼您將爲這些不同的代碼描述中的每一個都有單獨的行。

+0

你說得對,InvoiceItems.IIItemCodeDesc不需要在那裏,我忘了把它帶出查詢。這是完美的,我將不得不更多地瞭解它正在發生的事情,我對此不甚瞭解。我可能會問DBA我在哪裏工作一些。我確實有更多的工作要做(將IIItemCodeDesc與數量全部合併爲一行,例如3 BOARD 3 BDC 1 BATH),但現在我知道可以做很多工作。 – Rob 2013-04-28 00:38:50

相關問題