2016-11-15 4 views
0

Ich versuche 3 Ergebnisse von 3 verschiedene Anforderungen auf dem gleichen Tisch zu setzen:Wie innere Verknüpfung mit 3 Anfrage auf dem gleichen Tisch

Meine Tabelle:

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 

Meine Anfrage:

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; 

Das Problem ist: Ich weiß nicht, wie ich meine beiden Gruppen CTE1 & CTE4 beitreten. (Am Ende meiner Anfrage)

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

Weitere Informationen:

Der einzige Unterschied zwischen diesen drei Anfragen ist:
(TB_DW_CA_DETAIL_AGG.STATUT_FIAB=2 ) in der WHERE-Bedingung, die für mich ein anderes Ergebnis ergibt: sum(TB_DW_CA_DETAIL_AGG.MONTANT_QUOD)

ich möchte für die gleiche beizutreten:

DATE_VOL 
NUMERO_VOL 
CODE_CLIENT 
SITE_PROD 
CODE_CLASSE 
STATUT_FIAB 
CENTRE_PROFIT 

das Ergebnis sum(TB_DW_CA_DETAIL_AGG.MONTANT_QUOD) mit

(TB_DW_CA_DETAIL_AGG.STATUT_FIAB=2 )UND(TB_DW_CA_DETAIL_AGG.STATUT_FIAB=1 )UND ohne diese Bedingung.

  • CTE1 ist mein größter Wunsch (bekam alle Flüge)
  • CTE4 = CTE2 & CTE3
  • CTE1 = NO ZUSTAND AUF STATUT_FIAB
  • CTE2 = (TB_DW_CA_DETAIL_AGG.STATUT_FIAB = 2)
  • CTE3 = (TB_DW_CA_DETAIL_AGG.STATUT_FIAB = 1)

Vielen Dank für weitere Informationen.

+0

Können Sie näher erläutern, was DATE_VOL ist und welche Flüge Sie suchen? – fafl

+0

DATE_VOL ist das Datum meines Fluges. Ich möchte alle Flüge im Endergebnis haben – devicz

+0

Könntest du nicht einfach CTE1 mit CTE2 und CTE3 beitreten? Warum brauchst du CTE4? – fafl

Antwort

0

Nur eine Idee, brauchen Sie wirklich Joins hier? Oder könnten Sie einfach die Summen mit folgenden Unterabfragen berechnen:

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 
+0

Sie haben Recht, ich brauche nicht Join meine Ergebnisse hier. Ich schließe mich den ganzen Tag an, ich denke nicht einmal mit anderen Dingen ... Vielen Dank !! – devicz

+0

Froh, zu helfen :) – fafl

Verwandte Themen