SQL 加入返回重复行
SQL Join returning duplicate rows
我正在为如何表达我的问题而苦苦挣扎,对于任何混淆,我们深表歉意。我每次购买都有 3 个表:交易; TransactionEntry,其中包括交易中每个项目的单独行;和 TaxEntry,其中包括 TransactionEntry 中每个条目的 taxID 和 taxAmount。
我想按 TaxID 查找给定月份中每个 TaxAmount 和 price 的总计。 Price 和 Date 在 Transaction Entry 中找到,而 TaxAmount 和 TaxID 在 TaxEntry 中找到。此外,我们对每个项目(州和县)征收多项税。
我的表格看起来像这样:
交易条目:
TransactionNum Price Date
1 8.99 2015-01-06
1 3.65 2015-01-06
2 3.99 2015-03-06
税务条目:
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。我尝试的所有操作 returns 金额不正确,每个数字重复多次。
我的代码是:
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 做点什么,但它没有完成任何事情。
如果您预先汇总税金,您将得到正确的结果 table:
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 标准日期替换了您的日期常量。
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 )
| TRANSACTIONNUM | TOTAL_COST |
|----------------|------------|
| 1 | 14.03 |
| 2 | 4.43 |
我正在为如何表达我的问题而苦苦挣扎,对于任何混淆,我们深表歉意。我每次购买都有 3 个表:交易; TransactionEntry,其中包括交易中每个项目的单独行;和 TaxEntry,其中包括 TransactionEntry 中每个条目的 taxID 和 taxAmount。
我想按 TaxID 查找给定月份中每个 TaxAmount 和 price 的总计。 Price 和 Date 在 Transaction Entry 中找到,而 TaxAmount 和 TaxID 在 TaxEntry 中找到。此外,我们对每个项目(州和县)征收多项税。
我的表格看起来像这样:
交易条目:
TransactionNum Price Date
1 8.99 2015-01-06
1 3.65 2015-01-06
2 3.99 2015-03-06
税务条目:
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。我尝试的所有操作 returns 金额不正确,每个数字重复多次。
我的代码是:
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 做点什么,但它没有完成任何事情。
如果您预先汇总税金,您将得到正确的结果 table:
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 标准日期替换了您的日期常量。
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 )
| TRANSACTIONNUM | TOTAL_COST |
|----------------|------------|
| 1 | 14.03 |
| 2 | 4.43 |