2015-06-12 65 views
0

我很苦惱如何解釋我的問題,抱歉有任何混淆。我有3個表與每個購買相關聯:交易; TransactionEntry,它包含事務中每個項目的單獨行;和TaxEntry,其中包括TransactionEntry中每個條目的taxID和taxAmount。SQL加入返回重複行

我想要查找TaxID在每個TaxAmount和價格中給定月份的總額。價格和日期在交易條目中找到,而TaxAmount和TaxID在TaxEntry中找到。另外,我們每個項目(州和縣)有多個稅。

我的表是這個樣子:

事務條目:

TransactionNum Price Date 
1    8.99 2015-01-06  
1    3.65 2015-01-06  
2    3.99 2015-03-06  

TaxEntry:

TransactionNum TaxID TaxAmount 
1    2  0.89   
1    16  0.09   
1    2  0.37   
1    16  0.04   
2    4  0.40   
2    16  0.04   

我想找到價格的總和,通過TaxID,對於給定的月份。因此,例如,我想要爲TaxID 2返回8.99 + 3.65; TaxID 4爲3.99,TaxID 16爲8.99 + 3.65 + 3.99。我試過的每件事都會返回不正確的金額,每次重複多次。

我的代碼是:

SELECT SUM(Price), TaxID 
FROM TaxEntry XE 
JOIN TransactionEntry TE 
ON XE.TransactionNumber = TE.TransactionNumber 
WHERE CAST(TE.TransactionTime AS DATE) BETWEEN '06-01-2015' and '06-30-2015' 
GROUP BY XE.TaxID 

我的結果是高達三倍過大的範圍內。

我已經嘗試過與各種類型的連接,但它仍然重複信息。我覺得我應該用DISTINCT做點什麼,但是它沒有完成任何事情。

+0

只是注意到您的Transaction表中有多個TransactionID = 1。這是一個錯誤嗎? –

+0

它不會爲事務表中的重複transactionnum傳感器,這是錯誤結果的根本原因。 – Tim3880

+0

交易分錄表是否有主鍵?爲什麼有兩個價格映射到交易號碼1? –

回答

0

你會得到正確的結果,如果你預先彙整的稅率表:

SELECT XE.Price, TE.TaxID 
FROM (SELECT TransactionNumber, SUM(Price) as Price 
     FROM TaxEntry XE 
    ) XE JOIN 
    (SELECT TransactionNumber, TaxID 
     FROM TransactionNum TE 
     GROUP BY TransactionNumber 
    ) TE 
    ON XE.TransactionNumber = TE.TransactionNumber 
WHERE TE.TransactionTime >= '2015-06-01' AND 
     TE.TransactionTime < '2015-07-01' ; 

注意:

  • 每個子查詢,現在通過交易號聚集,都不會產生這樣重複的行。
  • 您不再需要外部group by
  • 花式日期算術已被直接比較代替。這允許使用索引(如果可用)。
  • 用ISO標準日期替換日期常量。
0

SQL Fiddle

的Oracle 11g R2架構設置

CREATE TABLE Transactions (TransactionNum, Price, "Date") AS 
      SELECT 1, 8.99, DATE '2015-06-01' FROM DUAL 
UNION ALL SELECT 1, 3.65, DATE '2015-06-01' FROM DUAL 
UNION ALL SELECT 2, 3.99, DATE '2015-06-03' FROM DUAL; 

CREATE TABLE Taxes (TransactionNum, TaxID, TaxAmount) AS 
      SELECT 1, 2,  0.89   FROM DUAL 
UNION ALL SELECT 1, 16,  0.09   FROM DUAL 
UNION ALL SELECT 1, 2,  0.37   FROM DUAL 
UNION ALL SELECT 1, 16,  0.04   FROM DUAL 
UNION ALL SELECT 2, 4,  0.40   FROM DUAL 
UNION ALL SELECT 2, 16,  0.04  FROM DUAL; 

查詢1

SELECT t.TransactionNum, 
     t.total_price + COALESCE(x.total_tax, 0) AS total_cost 
FROM (SELECT TransactionNum, 
       SUM(Price) AS total_price 
     FROM Transactions 
     WHERE "Date" BETWEEN DATE '2015-06-01' and DATE '2015-06-30' 
     GROUP BY TransactionNum) t 
     LEFT OUTER JOIN 
     (SELECT TransactionNum, 
       SUM(TaxAmount) AS total_tax 
     FROM Taxes 
     GROUP BY TransactionNum) x 
     ON (t.TransactionNum = x.TransactionNum) 

Results

| TRANSACTIONNUM | TOTAL_COST | 
|----------------|------------| 
|    1 |  14.03 | 
|    2 |  4.43 |