SQL Join返回重复的行

时间:2015-06-12 00:21:23

标签: sql join distinct

我正在努力解决我的问题,对不起任何困惑。我有3个表与每次购买相关联:交易; TransactionEntry,包括事务中每个项目的单独行;和TaxEntry,包括TransactionEntry中每个条目的taxID和taxAmount。

我想通过TaxID找到每个TaxAmount AND价格在给定月份的总数。价格和日期在交易条目中找到,而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.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做一些事情,但它无法完成任何事情。

2 个答案:

答案 0 :(得分:1)

如果您预先汇总税表,您将获得正确的结果:

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标准日期替换日期常量。

答案 1 :(得分: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 |