簡體   English   中英

SQL Join Sum表不同於單個查詢

[英]SQL Join Sum tables different from single queries

我的問題是:我有3個表InvoicedExpiredPayed ,每個表都有這些列:

  • customer_code
  • 類型

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM