如何在同一个 table 上加入 3 个请求

How to inner join with 3 request on the same table

我正在尝试将 3 个不同请求的 3 个结果合并到同一个 table:

我的table:

TB_DW_CA_DETAIL_AGG
    DATE_VOL
    NUMERO_VOL
    CODE_CLIENT
    SITE_PROD
    CODE_CLASSE
    STATUT_FIAB
    CENTRE_PROFIT
    TYPE_CA
    MONTANT_QUOD
    MONTANT_RISTOURNE
    MONTANT_AN
    MONTANT_TOT_QUOD
    MONTANT_TOT_MENS
    MONTANT_TOT_AN
    DATE_CHGT 

我的要求:

SELECT * FROM (

        SELECT
          TB_DW_CA_DETAIL_AGG.DATE_VOL AS DATE_VOL,
          TB_DW_CA_DETAIL_AGG.NUMERO_VOL,
          TB_DW_CA_DETAIL_AGG.CODE_CLIENT,
          TB_DW_CA_DETAIL_AGG.SITE_PROD,
          TB_DW_CA_DETAIL_AGG.CODE_CLASSE,
          TB_DW_CA_DETAIL_AGG.CENTRE_PROFIT,
          sum(TB_DW_CA_DETAIL_AGG.MONTANT_QUOD),
          TB_DW_CA_DETAIL_AGG.STATUT_FIAB,
          sum(TB_DW_CA_DETAIL_AGG.MONTANT_RISTOURNE)
        FROM
          TB_DW_CA_DETAIL_AGG
        WHERE
          (
           TB_DW_CA_DETAIL_AGG.DATE_VOL  <=  trunc(sysdate)-2
           AND
           TO_NUMBER(TO_CHAR(TB_DW_CA_DETAIL_AGG.DATE_VOL,'MM'))  =  CASE WHEN TO_NUMBER(TO_CHAR(sysdate,'DD')) = '1' OR TO_NUMBER(TO_CHAR(sysdate,'DD')) = '2' THEN TO_NUMBER(TO_CHAR(sysdate,'MM'))-1
        ELSE TO_NUMBER(TO_CHAR(sysdate,'MM'))
        END
           AND
           To_NUMBER(TO_CHAR(TB_DW_CA_DETAIL_AGG.DATE_VOL,'SYYYY'))  =  CASE WHEN TO_NUMBER(TO_CHAR(sysdate,'MM')) = '1' THEN TO_NUMBER(TO_CHAR(sysdate,'SYYYY'))-1
        ELSE TO_NUMBER(TO_CHAR(sysdate,'SYYYY'))
        END
           AND
           TB_DW_CA_DETAIL_AGG.SITE_PROD  <>  'LAT'
          )
        GROUP BY
          TB_DW_CA_DETAIL_AGG.DATE_VOL, TB_DW_CA_DETAIL_AGG.NUMERO_VOL, TB_DW_CA_DETAIL_AGG.CODE_CLIENT, TB_DW_CA_DETAIL_AGG.SITE_PROD, TB_DW_CA_DETAIL_AGG.CODE_CLASSE, 
        TB_DW_CA_DETAIL_AGG.CENTRE_PROFIT, TB_DW_CA_DETAIL_AGG.STATUT_FIAB
        ORDER BY   TB_DW_CA_DETAIL_AGG.DATE_VOL ASC
)  CTE1
INNER JOIN (

    select *  FROM
    (

                      SELECT
                       -- TO_NUMBER(TO_CHAR(TB_DW_CA_DETAIL_AGG.DATE_VOL,'MM')),
                        TB_DW_CA_DETAIL_AGG.DATE_VOL AS DATE_VOL,
                        TB_DW_CA_DETAIL_AGG.NUMERO_VOL,
                        TB_DW_CA_DETAIL_AGG.CODE_CLIENT,
                        TB_DW_CA_DETAIL_AGG.SITE_PROD,
                        TB_DW_CA_DETAIL_AGG.CODE_CLASSE,
                        TB_DW_CA_DETAIL_AGG.CENTRE_PROFIT,
                        sum(TB_DW_CA_DETAIL_AGG.MONTANT_QUOD),
                        TB_DW_CA_DETAIL_AGG.STATUT_FIAB
                      FROM
                        TB_DW_CA_DETAIL_AGG
                      WHERE
                      ( TB_DW_CA_DETAIL_AGG.STATUT_FIAB=2  )
                        AND  
                        (
                         TB_DW_CA_DETAIL_AGG.DATE_VOL  <=  trunc(sysdate)-2
                         AND
                         TO_NUMBER(TO_CHAR(TB_DW_CA_DETAIL_AGG.DATE_VOL,'MM'))  =  CASE WHEN TO_NUMBER(TO_CHAR(sysdate,'DD')) = '1' OR TO_NUMBER(TO_CHAR(sysdate,'DD')) = '2' THEN TO_NUMBER(TO_CHAR(sysdate,'MM'))-1
                      ELSE TO_NUMBER(TO_CHAR(sysdate,'MM'))
                      END
                         AND
                         To_NUMBER(TO_CHAR(TB_DW_CA_DETAIL_AGG.DATE_VOL,'SYYYY'))  =  CASE WHEN TO_NUMBER(TO_CHAR(sysdate,'MM')) = '1' THEN TO_NUMBER(TO_CHAR(sysdate,'SYYYY'))-1
                      ELSE TO_NUMBER(TO_CHAR(sysdate,'SYYYY'))
                      END
                         AND
                         TB_DW_CA_DETAIL_AGG.SITE_PROD  <>  'LAT'
                        )
                      GROUP BY
                       -- TO_NUMBER(TO_CHAR(TB_DW_CA_DETAIL_AGG.DATE_VOL,'MM')), 
                        TB_DW_CA_DETAIL_AGG.DATE_VOL, 
                        TB_DW_CA_DETAIL_AGG.NUMERO_VOL, 
                        TB_DW_CA_DETAIL_AGG.CODE_CLIENT, 
                        TB_DW_CA_DETAIL_AGG.SITE_PROD, 
                        TB_DW_CA_DETAIL_AGG.CODE_CLASSE, 
                        TB_DW_CA_DETAIL_AGG.CENTRE_PROFIT, 
                        TB_DW_CA_DETAIL_AGG.STATUT_FIAB
                                   )CTE2
                    INNER JOIN( 
                     SELECT
                        TB_DW_CA_DETAIL_AGG.DATE_VOL AS DATE_VOL,
                        TB_DW_CA_DETAIL_AGG.NUMERO_VOL,
                        TB_DW_CA_DETAIL_AGG.CODE_CLIENT,
                        TB_DW_CA_DETAIL_AGG.SITE_PROD,
                        TB_DW_CA_DETAIL_AGG.CODE_CLASSE,
                        TB_DW_CA_DETAIL_AGG.CENTRE_PROFIT,
                        sum(TB_DW_CA_DETAIL_AGG.MONTANT_QUOD),
                        TB_DW_CA_DETAIL_AGG.STATUT_FIAB
                      FROM
                        TB_DW_CA_DETAIL_AGG
                      WHERE
                      ( TB_DW_CA_DETAIL_AGG.STATUT_FIAB=1  )
                        AND  
                        (
                         TB_DW_CA_DETAIL_AGG.DATE_VOL  <=  trunc(sysdate)-2
                         AND
                         TO_NUMBER(TO_CHAR(TB_DW_CA_DETAIL_AGG.DATE_VOL,'MM'))  =  CASE WHEN TO_NUMBER(TO_CHAR(sysdate,'DD')) = '1' OR TO_NUMBER(TO_CHAR(sysdate,'DD')) = '2' THEN TO_NUMBER(TO_CHAR(sysdate,'MM'))-1
                      ELSE TO_NUMBER(TO_CHAR(sysdate,'MM'))
                      END
                         AND
                         To_NUMBER(TO_CHAR(TB_DW_CA_DETAIL_AGG.DATE_VOL,'SYYYY'))  =  CASE WHEN TO_NUMBER(TO_CHAR(sysdate,'MM')) = '1' THEN TO_NUMBER(TO_CHAR(sysdate,'SYYYY'))-1
                      ELSE TO_NUMBER(TO_CHAR(sysdate,'SYYYY'))
                      END
                         AND
                         TB_DW_CA_DETAIL_AGG.SITE_PROD  <>  'LAT'


                        )
                      GROUP BY
                        TB_DW_CA_DETAIL_AGG.DATE_VOL, TB_DW_CA_DETAIL_AGG.NUMERO_VOL, TB_DW_CA_DETAIL_AGG.CODE_CLIENT, TB_DW_CA_DETAIL_AGG.SITE_PROD, TB_DW_CA_DETAIL_AGG.CODE_CLASSE, 
                      TB_DW_CA_DETAIL_AGG.CENTRE_PROFIT, TB_DW_CA_DETAIL_AGG.STATUT_FIAB
                      ORDER BY 
                      TB_DW_CA_DETAIL_AGG.DATE_VOL) CTE3
                      ON CTE2.DATE_VOL = CTE3.DATE_VOL ) CTE4
 ON CTE1.DATE_VOL=CTE4.DATE_VOL;

问题是:我不知道如何加入我的两个群组 CTE1 和 CTE4。 (在我的请求结束时)

 ON CTE2.DATE_VOL = CTE3.DATE_VOL ) CTE4
     ON CTE1.DATE_VOL=CTE4.DATE_VOL; 

更多信息

这 3 个请求之间的唯一区别是:
( TB_DW_CA_DETAIL_AGG.STATUT_FIAB=2 ) 在 WHERE 条件下,谁给了我不同的结果: sum(TB_DW_CA_DETAIL_AGG.MONTANT_QUOD)

我也想加入:

DATE_VOL
NUMERO_VOL
CODE_CLIENT
SITE_PROD
CODE_CLASSE
STATUT_FIAB
CENTRE_PROFIT

sum(TB_DW_CA_DETAIL_AGG.MONTANT_QUOD)

的结果

( TB_DW_CA_DETAIL_AGG.STATUT_FIAB=2 ) AND (TB_DW_CA_DETAIL_AGG.STATUT_FIAB=1 ) AND 没有这个条件。

非常感谢您提供任何信息。

只是一个想法,你真的需要在这里加入吗?或者您可以像这样使用子查询计算总和:

SELECT
    TB_DW_CA_DETAIL_AGG.DATE_VOL AS DATE_VOL,
    TB_DW_CA_DETAIL_AGG.NUMERO_VOL,
    TB_DW_CA_DETAIL_AGG.CODE_CLIENT,
    TB_DW_CA_DETAIL_AGG.SITE_PROD,
    TB_DW_CA_DETAIL_AGG.CODE_CLASSE,
    TB_DW_CA_DETAIL_AGG.CENTRE_PROFIT,
    sum(TB_DW_CA_DETAIL_AGG.MONTANT_QUOD) AS sum_all,
    sum(case when TB_DW_CA_DETAIL_AGG.STATUT_FIAB=1 then TB_DW_CA_DETAIL_AGG.MONTANT_QUOD else 0 end) AS sum_fiab_1,
    sum(case when TB_DW_CA_DETAIL_AGG.STATUT_FIAB=2 then TB_DW_CA_DETAIL_AGG.MONTANT_QUOD else 0 end) AS sum_fiab_2,
    TB_DW_CA_DETAIL_AGG.STATUT_FIAB,
    sum(TB_DW_CA_DETAIL_AGG.MONTANT_RISTOURNE)
FROM
    TB_DW_CA_DETAIL_AGG
WHERE (
    TB_DW_CA_DETAIL_AGG.DATE_VOL <= trunc(sysdate)-2
    AND TO_NUMBER(TO_CHAR(TB_DW_CA_DETAIL_AGG.DATE_VOL,'MM')) = CASE
        WHEN TO_NUMBER(TO_CHAR(sysdate,'DD')) = '1' OR TO_NUMBER(TO_CHAR(sysdate,'DD')) = '2'
        THEN TO_NUMBER(TO_CHAR(sysdate,'MM'))-1
        ELSE TO_NUMBER(TO_CHAR(sysdate,'MM'))
    END
    AND To_NUMBER(TO_CHAR(TB_DW_CA_DETAIL_AGG.DATE_VOL,'SYYYY')) = CASE
        WHEN TO_NUMBER(TO_CHAR(sysdate,'MM')) = '1'
        THEN TO_NUMBER(TO_CHAR(sysdate,'SYYYY'))-1
        ELSE TO_NUMBER(TO_CHAR(sysdate,'SYYYY'))
    END
    AND TB_DW_CA_DETAIL_AGG.SITE_PROD  <>  'LAT'
)
GROUP BY
    TB_DW_CA_DETAIL_AGG.DATE_VOL,
    TB_DW_CA_DETAIL_AGG.NUMERO_VOL,
    TB_DW_CA_DETAIL_AGG.CODE_CLIENT,
    TB_DW_CA_DETAIL_AGG.SITE_PROD,
    TB_DW_CA_DETAIL_AGG.CODE_CLASSE,
    TB_DW_CA_DETAIL_AGG.CENTRE_PROFIT,
    TB_DW_CA_DETAIL_AGG.STATUT_FIAB
ORDER BY
     TB_DW_CA_DETAIL_AGG.DATE_VOL ASC