![](/img/trans.png)
[英]SQL query to join 4 Tables and get sum of 2 columns from 2 different tables
[英]SQL Join Sum tables different from single queries
我的問題是:我有3個表Invoiced
, Expired
, Payed
,每個表都有這些列:
在Oracle中,我試圖這樣做:
SELECT
C.customer_code,
C.type,
SUM(C.AMOUNT) AS AMOUNT_EXPIRED,
SUM(F.AMOUNT) AS AMOUNT_INVOICED,
SUM(R.AMOUNT) AS AMOUNT_PAYED
FROM Expired C
LEFT JOIN (SELECT customer_code, ACCOUNT, SUM(AMOUNT) AS AMOUNT
FROM Invoiced
GROUP BY customer_code, type) F
ON C.customer_code = F.customer_code
AND C.type = F.type
LEFT JOIN (SELECT customer_code, type, SUM(AMOUNT) AS AMOUNT
FROM Payed
GROUP BY customer_code, type) R
ON C.customer_code = R.customer_code
AND C.type = R.type
GROUP BY C.customer_code, C.type,
R.customer_code, R.type,
F.customer_code, F.type
我得到一個帶有列的表:
------------------------------------------------------------------------
customer_code | type | amount_expired | amount invoiced | amount payed
------------------------------------------------------------------------
但是對於單個查詢,金額是不同的:
SELECT customer_code, type, SUM(AMOUNT) AS AMOUNT FROM expired GROUP BY customer_code, type
SELECT customer_code, type, SUM(AMOUNT) AS AMOUNT FROM invoiced GROUP BY customer_code, type
SELECT customer_code, type, SUM(AMOUNT) AS AMOUNT FROM payed GROUP BY customer_code, type
有人可以幫助我嗎?
使用union
而不是join
。 但是,您應該有一個表來存儲所有客戶代碼和類型。 而且,在涉及聚合函數時,永遠不要使用join
。 這非常令人困惑,通常會產生不正確的結果。
with CUSTOMER as (
select CUSTOMER_CODE, TYPE from EXPIRED group by CUSTOMER_CODE, TYPE
union
select CUSTOMER_CODE, TYPE from INVOICED group by CUSTOMER_CODE, TYPE
union
select CUSTOMER_CODE, TYPE from PAYED group by CUSTOMER_CODE, TYPE
)
select
c.CUSTOMER_CODE, c.TYPE
,(
select sum(AMOUNT)
from EXPIRED
where CUSTOMER_CODE = c.CUSTOMER_CODE and TYPE = c.TYPE
) as AMOUNT_EXPIRED
,(
select sum(AMOUNT)
from INVOICED
where CUSTOMER_CODE = c.CUSTOMER_CODE and TYPE = c.TYPE
) as AMOUNT_INVOICED
,(
select sum(AMOUNT)
from PAYED
where CUSTOMER_CODE = c.CUSTOMER_CODE and TYPE = c.TYPE
) as AMOUNT_EXPIRED
from CUSTOMER c
order by c.CUSTOMER_CODE, c.TYPE
您的第二個子查詢可能是原因,這可能是您期望的;
SELECT C.customer_code, C.type,
SUM(C.AMOUNT) AS AMOUNT_EXPIRED,
SUM(F.AMOUNT) AS AMOUNT_INVOICED,
SUM(R.AMOUNT) AS AMOUNT_PAYED
FROM Expired C
LEFT JOIN invoiced F
ON C.customer_code= F.customer_code
AND C.type= F.type
LEFT JOIN payed R
ON C.customer_code= R.customer_code
AND C.type= R.type
GROUP BY C.customer_code, C.type
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.