IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Problème sur une jointure dans le nombre de réponses


Sujet :

SQL Oracle

  1. #21
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    Il manque encore la table RESORT_ORIGINS_OF_BOOKING, Celle que tu donnes c'est le script de la RESERVATION_SUMMARY

  2. #22
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Désolé voici la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
     
    CREATE TABLE OPERA.RESORT_ORIGINS_OF_BOOKING
    (
      RESORT              VARCHAR2(20 BYTE)         NOT NULL,
      SOURCE_CODE         VARCHAR2(20 BYTE)         NOT NULL,
      PARENT_SOURCE_CODE  VARCHAR2(20 BYTE),
      DESCRIPTION         VARCHAR2(2000 BYTE),
      INSERT_USER         NUMBER                    NOT NULL,
      INSERT_DATE         DATE                      NOT NULL,
      UPDATE_USER         NUMBER                    NOT NULL,
      UPDATE_DATE         DATE                      NOT NULL,
      INACTIVE_DATE       DATE,
      SELL_SEQUENCE       NUMBER,
      SC_ORDERBY          NUMBER
    )
    TABLESPACE OPERA_DATA
    PCTUSED    0
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          512K
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    NOPARALLEL
    MONITORING;
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.INSERT_DATE IS 'The date the record was created';
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.UPDATE_USER IS 'The user that modified the record';
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.UPDATE_DATE IS 'The date the record was modified';
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.INACTIVE_DATE IS 'The date the record was marked as inactive';
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.SELL_SEQUENCE IS 'Display sequence';
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.SC_ORDERBY IS 'S&C Display Sequence';
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.RESORT IS 'The property that the record belongs to';
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.SOURCE_CODE IS 'Source code';
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.PARENT_SOURCE_CODE IS 'Source group associated to the source code';
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.DESCRIPTION IS 'Source description';
     
    COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.INSERT_USER IS 'The user that created the record';
     
     
    CREATE UNIQUE INDEX OPERA.SOURCES_PK ON OPERA.RESORT_ORIGINS_OF_BOOKING
    (RESORT, SOURCE_CODE)
    LOGGING
    TABLESPACE OPERA_INDX
    PCTFREE    10
    INITRANS   2
    MAXTRANS   255
    STORAGE    (
                INITIAL          256K
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               )
    NOPARALLEL;
     
     
    CREATE UNIQUE INDEX OPERA.SOURCE_RESORT_IDX ON OPERA.RESORT_ORIGINS_OF_BOOKING
    (SOURCE_CODE, RESORT)
    LOGGING
    TABLESPACE OPERA_INDX
    PCTFREE    10
    INITRANS   2
    MAXTRANS   255
    STORAGE    (
                INITIAL          1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
               )
    NOPARALLEL;
     
     
    CREATE OR REPLACE TRIGGER OPERA.actlog_res_org_booking_aiud
    AFTER INSERT  OR DELETE  OR UPDATE
    ON resort_origins_of_booking
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    Begin
     Declare
       vEvent_type varchar2(1);
       vOld_Rec   RESORT_ORIGINS_OF_BOOKING%ROWTYPE;
       vNew_Rec   RESORT_ORIGINS_OF_BOOKING%ROWTYPE;
     Begin
       if inserting then
        vEvent_type := 'I';
       elsif updating then
        vEvent_type := 'U';
       elsif deleting then
        vEvent_type := 'D';
       end if;
    --+ Copy old values into Old_rec variables
      vOld_rec.RESORT                :=   :old.RESORT;
      vOld_rec.SOURCE_CODE           :=   :old.SOURCE_CODE;
      vOld_rec.DESCRIPTION           :=   :old.DESCRIPTION;
      vOld_rec.PARENT_SOURCE_CODE    :=   :old.PARENT_SOURCE_CODE;
      vOld_rec.INACTIVE_DATE         :=   :old.INACTIVE_DATE;
    --+ Copy New values into New_rec variables
      vNew_rec.RESORT                :=   :new.RESORT;
      vNew_rec.SOURCE_CODE           :=   :new.SOURCE_CODE;
      vNew_rec.DESCRIPTION           :=   :new.DESCRIPTION;
      vNew_rec.PARENT_SOURCE_CODE    :=   :new.PARENT_SOURCE_CODE;
      vNew_rec.INACTIVE_DATE         :=   :new.INACTIVE_DATE;
      ACTION_LOG.CAPTURE_SOURCE_CODES(vEvent_type, vOld_Rec, vNew_Rec);
     End;
    End;
    /
     
     
    CREATE OR REPLACE TRIGGER OPERA.resort_origins_of_booking_bi
    before insert on Resort_origins_of_booking
    for each row
    begin
      if not pms_p.addon_license('OPP_MHOT') then
         DECLARE
           temp_var char:=null;
         BEGIN
           Select 'x' into temp_var from origins_of_booking_template
           where source_code=:new.source_code;
         EXCEPTION
           WHEN TOO_MANY_ROWS THEN
              NULL;
           WHEN NO_DATA_FOUND THEN
             insert into origins_of_booking_template
                 (source_code,parent_source_code,description,insert_user,
                  insert_date,update_user,update_date,inactive_date,sell_sequence,
                  sc_orderby)
              values (:new.source_code,
                      :new.parent_source_code,
                      :new.description,
                      :new.insert_user,
                      :new.insert_date,
                      :new.update_user,
                      :new.update_date,
                      :new.inactive_date,
                      :new.sell_sequence,
                      :new.sc_orderby);
         END;
       end if;
    end;
    /
     
     
    DROP SYNONYM OXI.RESORT_ORIGINS_OF_BOOKING;
     
    CREATE SYNONYM OXI.RESORT_ORIGINS_OF_BOOKING FOR OPERA.RESORT_ORIGINS_OF_BOOKING;
     
     
    DROP SYNONYM OXIHUB.RESORT_ORIGINS_OF_BOOKING;
     
    CREATE SYNONYM OXIHUB.RESORT_ORIGINS_OF_BOOKING FOR OPERA.RESORT_ORIGINS_OF_BOOKING;
     
     
    ALTER TABLE OPERA.RESORT_ORIGINS_OF_BOOKING ADD (
      CONSTRAINT SOURCES_PK
     PRIMARY KEY
     (RESORT, SOURCE_CODE)
        USING INDEX 
        TABLESPACE OPERA_INDX
        PCTFREE    10
        INITRANS   2
        MAXTRANS   255
        STORAGE    (
                    INITIAL          256K
                    MINEXTENTS       1
                    MAXEXTENTS       UNLIMITED
                    PCTINCREASE      0
                   ));

  3. #23
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    Il y a un problème avec le champs resv_status qui est présent dans 2 tables. Il faudrait savoir dans quelle table tu prends le champs

    Présent dans la table RESERVATION_SUMMARY et RESERVATION_NAME.

    Je pense que quand tu mets en commentaire les 2 LEFT OUTER JOIN, ta base prend le champs resv_status de RESERVATION_NAME, quand tu enlèves les 2 commentaires il prend celui de RESERVATION_SUMMARY . Or la table RESERVATION_SUMMARY est en LEFT OUTER JOIN mais tu as une restriction dans ton WHERE donc Oracle fait un INNER JOIN implicite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    SELECT DISTINCT 
       (NA.TITLE || ' ' || RN.SGUEST_FIRSTNAME || ' '|| RN.SGUEST_NAME) AS CLIENT_NOM,
       DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE')                           AS client_pays, -- ALIAS ICI VER QUELLE TABLE?
       CASE
            WHEN RN.resort = 'OPERA'
                 THEN 'Best Western Premier Opera Diamond'
            WHEN RN.resort = 'BATIGN'
                 THEN 'Opera Batignolles Hotel'
            WHEN RN.resort = 'PPN'
                 THEN 'Comfort et Quality Hotel Centre del Mon'
       end                                                    CLIENT_HOTEL,
       TO_CHAR (RN.TRUNC_ACTUAL_CHECK_IN_DATE,'DD/MM/YYYY')                            AS HOTEL_DATE_ENTREE,
       TO_CHAR (RN.TRUNC_ACTUAL_CHECK_OUT_DATE,'DD/MM/YYYY')                            AS HOTEL_DATE_SORTIE,
       LOWER (PH.phone_number)                                        AS client_email,
       RO.DESCRIPTION AS ORIGINE_RESERVATION,
       TRUNC (SYSDATE - TO_DATE (RN.trunc_actual_check_out_date))                        AS nb_jours
    from RESERVATION_NAME         RN
        INNER JOIN         name                       NA ON   NA.NAME_ID =RN.NAME_ID
        INNER JOIN         NAME_PHONE               PH ON  PH.NAME_ID=RN.NAME_ID  
        LEFT OUTER JOIN RESERVATION_SUMMARY         RS ON  RS.EVENT_ID=RN.RESV_NAME_ID   
        LEFT OUTER JOIN RESORT_ORIGINS_OF_BOOKING RO ON  RO.RESORT=RS.RESORT   AND RO.SOURCE_CODE =RS.SOURCE_CODE  
    where 1=1
    AND   RN.resv_status = 'CHECKED OUT'
    AND   TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 
    AND   REGEXP_LIKE (LOWER(PH.phone_number), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
    and   RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy')
    ORDER BY NB_JOURS DESC
     
    Soit tu mets dans la clause where AND   RN.resv_status = 'CHECKED OUT'
     
    Soit tu mets après dans ton LEFT OUTER join 
     
    LEFT OUTER JOIN RESERVATION_SUMMARY         RS ON  RS.EVENT_ID=RN.RESV_NAME_ID   AND   RS.resv_status = 'CHECKED OUT'

  4. #24
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Trop fort !
    Donc je dois préfixer avec RESERVATION_NAME devant resv_status alors ?

  5. #25
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    SI tu veux prendre le champs resv_status dans table RESERVATION_NAME alors il faut juste reprendre ma requete du dessus avec le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND   RN.resv_status = 'CHECKED OUT'

  6. #26
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Oui j'ai vu ça fonctionne nickel, vraiment très fort, il y a de l'expertise
    Ce qui nous donne au final la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    SELECT DISTINCT 
       (NA.TITLE || ' ' || RN.SGUEST_FIRSTNAME || ' '|| RN.SGUEST_NAME) AS CLIENT_NOM,
       DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE') AS client_pays, -- ALIAS ICI VER QUELLE TABLE?
       CASE
            WHEN RN.RESORT = 'OPERA'
                 THEN 'Best Western Premier Opera Diamond'
            WHEN RN.RESORT = 'BATIGN'
                 THEN 'Opera Batignolles Hotel'
            WHEN RN.RESORT = 'PPN'
                 THEN 'Comfort et Quality Hotel Centre del Mon'
       END CLIENT_HOTEL,
       TO_CHAR (RN.TRUNC_ACTUAL_CHECK_IN_DATE,'DD/MM/YYYY') AS HOTEL_DATE_ENTREE,
       TO_CHAR (RN.TRUNC_ACTUAL_CHECK_OUT_DATE,'DD/MM/YYYY') AS HOTEL_DATE_SORTIE,
       LOWER (PH.phone_number) AS client_email,
       RO.DESCRIPTION AS ORIGINE_RESERVATION,
       TRUNC (SYSDATE - TO_DATE (RN.trunc_actual_check_out_date))  AS nb_jours
    FROM OPERA.RESERVATION_NAME RN
        INNER JOIN OPERA.NAME NA ON NA.NAME_ID =RN.NAME_ID
        INNER JOIN OPERA.NAME_PHONE PH ON PH.NAME_ID=RN.NAME_ID  
        LEFT OUTER JOIN OPERA.RESERVATION_SUMMARY RS ON RS.EVENT_ID=RN.RESV_NAME_ID   
        LEFT OUTER JOIN OPERA.RESORT_ORIGINS_OF_BOOKING RO ON RO.RESORT=RS.RESORT AND RO.SOURCE_CODE =RS.SOURCE_CODE  
    WHERE 1=1
    AND   RN.RESV_STATUS = 'CHECKED OUT'
    AND   TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 
    AND   REGEXP_LIKE (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
    AND   RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy')
    ORDER BY NB_JOURS DESC

  7. #27
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut Petite modification
    Merci beaucoup pour vos réponses, j'ai besoin d'apporter une modification dans la requête :
    dans le cas où RN.RESORT = 'PPN', je dois modifier la REGEXP pour mettre
    '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+' sur le champ phone_number
    et sortir à l'affichage un email conforme (sans le *)

  8. #28
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    ça doit donner un truc comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    where 1=1
    and 
    (
        (RN.RESV_STATUS = 'CHECKED OUT'
        and   regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
        )
    or
        (RN.RESV_STATUS = 'PPN'
        and   regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
        )
    )
    AND   TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 
    AND   RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy')
    ORDER BY NB_JOURS DESC
    Pense à mettre en résolu

    Bonne journée

  9. #29
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Mais tu es sûr, car je vois pas de case when ? et je vois pas comment afficher les réponses sans les "*" ? en fait dans le cas de l'hôtel 'PPN' on a inversé le processus, on doit envoyer aussi aux gens qui ont un '*' dans leur email, par contre il faut que l'email soit débarrassé de '*' à l'affichage pour le logiciel d'emailing.

  10. #30
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    A d'accord je n'ai fait que la partie WHERE.

    Il faut donc que tu remplace dans le select

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LOWER (PH.phone_number) AS client_email,
    par


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CASE WHEN RN.RESV_STATUS = 'CHECKED OUT' THEN
    'AFFICHE ICI TON RESULTAT 1'
    WHEN RN.RESV_STATUS = 'PPN' THEN 
    'AFFICHE ICI TON RESULTAT 2'
    else
    LOWER (PH.phone_number) 
    END
     
    AS client_email,
    Aussi pour ton decode pour faire propre ajoute le cas par defaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE','PAS_FR_NI_EN') AS client_pays,

  11. #31
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut J'ai une erreur
    Désolé, en voulant appliquer (forcément mal) tes conseils, voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    SELECT DISTINCT 
       (NA.TITLE || ' ' || RN.SGUEST_FIRSTNAME || ' '|| RN.SGUEST_NAME) AS CLIENT_NOM,
       DECODE (LANGUAGE, 'F', 'FR','E', 'EN') AS client_pays, 
       CASE
            WHEN RN.RESORT = 'OPERA'
                 THEN 'Best Western Premier Opera Diamond'
            WHEN RN.RESORT = 'BATIGN'
                 THEN 'Opera Batignolles Hotel'
            WHEN RN.RESORT = 'PPN'
                 THEN 'Comfort et Quality Hotel Centre del Mon'
       END                                                    CLIENT_HOTEL,
       TO_CHAR (RN.TRUNC_ACTUAL_CHECK_IN_DATE,'DD/MM/YYYY') AS HOTEL_DATE_ENTREE,
       TO_CHAR (RN.TRUNC_ACTUAL_CHECK_OUT_DATE,'DD/MM/YYYY') AS HOTEL_DATE_SORTIE,
       LOWER (PH.phone_number) AS client_email,
       RO.DESCRIPTION AS ORIGINE_RESERVATION,
       TRUNC (SYSDATE - TO_DATE (RN.trunc_actual_check_out_date)) AS nb_jours
    FROM OPERA.RESERVATION_NAME RN
        INNER JOIN OPERA.NAME NA ON NA.NAME_ID =RN.NAME_ID
        INNER JOIN OPERA.NAME_PHONE PH ON  PH.NAME_ID=RN.NAME_ID  
        LEFT OUTER JOIN OPERA.RESERVATION_SUMMARY         RS ON  RS.EVENT_ID=RN.RESV_NAME_ID   
        LEFT OUTER JOIN OPERA.RESORT_ORIGINS_OF_BOOKING RO ON  RO.RESORT=RS.RESORT   AND RO.SOURCE_CODE =RS.SOURCE_CODE  
    WHERE 1=1
    AND   RN.RESV_STATUS = 'CHECKED OUT'
    AND   TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 
    AND 
        (CASE
            WHEN RN.RESORT = 'PPN'
                 THEN REGEXP_LIKE (LOWER(PH.phone_number), '^[a-zA-Z0-9\-_\*]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
            ELSE
                REGEXP_LIKE (LOWER(PH.phone_number), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
       END)
    AND   RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy')
    ORDER BY NB_JOURS DESC
    Voici l'erreur qu'il me met
    ORA-00920: invalid relational operator
    sur "AND RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy')"

  12. #32
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    Le dernier message concernait un block a mettre dans ton Select Ajouter au block du dessus , le block WHERE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    SELECT DISTINCT 
       (NA.TITLE || ' ' || RN.SGUEST_FIRSTNAME || ' '|| RN.SGUEST_NAME) AS CLIENT_NOM,
       DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE','PAS_FR_NI_EN') AS client_pays, 
       CASE
            WHEN RN.RESORT = 'OPERA'
                 THEN 'Best Western Premier Opera Diamond'
            WHEN RN.RESORT = 'BATIGN'
                 THEN 'Opera Batignolles Hotel'
            WHEN RN.RESORT = 'PPN'
                 THEN 'Comfort et Quality Hotel Centre del Mon'
       END                                                    CLIENT_HOTEL,
       TO_CHAR (RN.TRUNC_ACTUAL_CHECK_IN_DATE,'DD/MM/YYYY') AS HOTEL_DATE_ENTREE,
       TO_CHAR (RN.TRUNC_ACTUAL_CHECK_OUT_DATE,'DD/MM/YYYY') as HOTEL_DATE_SORTIE,
       case when RN.RESV_STATUS = 'CHECKED OUT' then 'AFFICHE ICI TON RESULTAT 1'
        when RN.RESV_STATUS = 'PPN' then 'AFFICHE ICI TON RESULTAT 2'
        else
        LOWER (PH.PHONE_NUMBER) 
        END AS client_email,
       RO.DESCRIPTION AS ORIGINE_RESERVATION,
       TRUNC (SYSDATE - TO_DATE (RN.trunc_actual_check_out_date)) AS nb_jours
    FROM OPERA.RESERVATION_NAME RN
        INNER JOIN OPERA.NAME NA ON NA.NAME_ID =RN.NAME_ID
        INNER JOIN OPERA.NAME_PHONE PH ON  PH.NAME_ID=RN.NAME_ID  
        LEFT OUTER JOIN OPERA.RESERVATION_SUMMARY         RS ON  RS.EVENT_ID=RN.RESV_NAME_ID   
        LEFT OUTER JOIN OPERA.RESORT_ORIGINS_OF_BOOKING RO ON  RO.RESORT=RS.RESORT   AND RO.SOURCE_CODE =RS.SOURCE_CODE  
    WHERE 1=1
    AND 
    (
        (RN.RESV_STATUS = 'CHECKED OUT'
        AND   regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
        )
    OR
        (RN.RESV_STATUS = 'PPN'
        AND   regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
        )
    )
    AND   TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 
    AND   RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy')
    ORDER BY NB_JOURS DESC

  13. #33
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Non mais je crois que tu n'as pas compris ce dont je parle, je dois faire une REGEXP sur le champ PH.phone_number de façon conditionnel, si le champ RN.RESORT = 'PPN j'applique la REGEXP 1 à mon champ PH.phone_number sinon pour les autres valeurs de RN.RESORT j'applique la REGEXP 2. Enfin, l'extract est destiné à un emaling, donc à la sortie, je dois également enlever les "*" du champ phone_number

  14. #34
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    J'ai bien compris ne t'inquiète pas il faut juste mettre le bon REGEXP à la place de 'AFFICHE ICI TON RESULTAT 1' et 'AFFICHE ICI TON RESULTAT 2'

  15. #35
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Bonjour,

    Désolé de répondre si tard, j'étais en déplacement, je viens de rentrer et je regarde de suite la suite de nos discussions . Sur ta réponse, en fait ce qui me gêne, a moins que je comprennes pas, c'est ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    case when RN.RESV_STATUS = 'CHECKED OUT' then 'AFFICHE ICI TON RESULTAT 1'
        when RN.RESV_STATUS = 'PPN' then 'AFFICHE ICI TON RESULTAT 2'
        else
        LOWER (PH.PHONE_NUMBER) 
        END AS client_email,
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    AND 
    (
        (RN.RESV_STATUS = 'CHECKED OUT'
        AND   regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
        )
    OR
        (RN.RESV_STATUS = 'PPN'
        AND   regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
        )
    )
    ça ne répond pas, il me semble, à la question que je pose..

  16. #36
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    Pour cette partie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    AND 
    (
        (RN.RESV_STATUS = 'CHECKED OUT'
        AND   regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
        )
    OR
        (RN.RESV_STATUS = 'PPN'
        AND   regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
        )
    )
    ça selectionne ton adresse mail en fonction du RESV_STATUS car de ce que comprend l'adresse mail n'est pas du même type en fonction du RESV_STATUS

    Pour la partie suivante c'est pour l'affichage quand la valeur RESV_STATUS = 'CHECKED OUT' alors tu affiches l'adresse mail comme tu veux ( remplace 'AFFICHE ICI TON RESULTAT 1' par ton expression régulière). Quand tu as RN.RESV_STATUS = 'PPN' tu affiches l'adresse mail mais d'une autre façon et enfin dans le cas où ce n'est pas l'un des 2 tu affiches le mail brut de forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    case when RN.RESV_STATUS = 'CHECKED OUT' then 'AFFICHE ICI TON RESULTAT 1'
        when RN.RESV_STATUS = 'PPN' then 'AFFICHE ICI TON RESULTAT 2'
        else
        LOWER (PH.PHONE_NUMBER) 
        END AS client_email,

  17. #37
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Bonjour Attila771,
    je dois mal m'exprimer, désolé je vais te réexposer mon problème :
    le resv_status vaut tout le temps "CHECKED OUT" car il s'agit de collecter tous les clients de 3 hôtels (et qui sont déjà partis (le fameux "CHECKED OUT", qu'on distingue par le code établissement "reservation_name.resort" ('OPERA', 'BATIGN' et enfin 'PPN').
    Pour chacun de ces établissments, on récupère les infos de séjour du client (nom, prénom, date d'entrée, date de sortie, email, etc....).
    Il existe cependant une restriction fonctionnelle, pour éviter que certains clients ne recoivent l'email (parce qu'ils ne veulent plus par exemple), on rajoute une "*" quelque part dans leur email, pour ceux-là il ne faut pas les prendre, et bien sûr, il ne faut que le champs contienne bien un email (d'où la REGEXP). Sauf un cas particulier pour l'établissement PPN : reservation_name.resort = 'PPN', pour lui on a inversé, on envoit uniquement qu'à ceux qui ont "*" dans le champ email, mais bien sûr, à l'affichage on enlève '*' pour que l'outil d'emailing ne plante pas, je sais pas si c'est plus clair ainsi...

  18. #38
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    Salut,

    Voici la nouvelle version en fonction de ce que tu viens de me dire.

    J'ai ajouté des commentaires, il faut que tu vérifies les expressions régulières je ne suis pas super fort dans ce domaine


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    SELECT DISTINCT 
       (NA.TITLE || ' ' || RN.SGUEST_FIRSTNAME || ' '|| RN.SGUEST_NAME) AS CLIENT_NOM,
       DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE','PAS_FR_NI_EN') AS client_pays, 
       CASE
            WHEN RN.RESORT = 'OPERA'
                 THEN 'Best Western Premier Opera Diamond'
            WHEN RN.RESORT = 'BATIGN'
                 THEN 'Opera Batignolles Hotel'
            WHEN RN.RESORT = 'PPN'
                 THEN 'Comfort et Quality Hotel Centre del Mon'
       END    CLIENT_HOTEL,
       TO_CHAR (RN.TRUNC_ACTUAL_CHECK_IN_DATE,'DD/MM/YYYY') AS HOTEL_DATE_ENTREE,
       TO_CHAR (RN.TRUNC_ACTUAL_CHECK_OUT_DATE,'DD/MM/YYYY') as HOTEL_DATE_SORTIE,
       case  when RN.RESV_STATUS = 'PPN' then 'AFFICHE ICI TON cas AVEC * dans le PPN'
        else  'AFFICHE ICI TON CAS STANDART OU IL y A PAS DE *'  END AS client_email,
       RO.DESCRIPTION AS ORIGINE_RESERVATION,
       TRUNC (SYSDATE - TO_DATE (RN.trunc_actual_check_out_date)) AS nb_jours
    FROM OPERA.RESERVATION_NAME RN
        INNER JOIN OPERA.NAME NA ON NA.NAME_ID =RN.NAME_ID
        INNER JOIN OPERA.NAME_PHONE PH ON  PH.NAME_ID=RN.NAME_ID  
        LEFT OUTER JOIN OPERA.RESERVATION_SUMMARY         RS ON  RS.EVENT_ID=RN.RESV_NAME_ID   
        LEFT OUTER JOIN OPERA.RESORT_ORIGINS_OF_BOOKING RO ON  RO.RESORT=RS.RESORT   AND RO.SOURCE_CODE =RS.SOURCE_CODE  
    where 1=1
    and RN.RESV_STATUS = 'CHECKED OUT' -- dans tous les cas ils sont CHECKED OUT
    and
    (-- premier cas on prend tous ceux qui n'ont pas de * dans leur email
        (
      regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
        )
    OR-- Deuxieme cas on prend ceux qui ont une * dans leur mail et qui sont 
        (RN.RESORT = 'PPN'
        AND   regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
        )
    )
    AND   TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 
    and   RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy')
    ORDER BY NB_JOURS DESC

  19. #39
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Merci Attila771 pour ta réponse, c'est presque bon, simplement comment j'affiche mon email sans les "*" (dans le champ "LOWER (phone_number) AS client_email") à ce niveau là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CASE  WHEN RN.RESV_STATUS = 'PPN' THEN 'AFFICHE ICI TON cas AVEC * dans le PPN'
        ELSE  'AFFICHE ICI TON CAS STANDART OU IL y A PAS DE *'  
        END AS client_email

  20. #40
    Membre habitué
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Points : 162
    Points
    162
    Par défaut
    Je me suis trompé en fait c'est tout simple pour l'affichage comme tu as déjà filtré dans ton Where il faut juste mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    REPLACE(LOWER (phone_number),'*') END AS client_email
    Cette fonction va remplacer tes * par rien.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Problème sur une jointure
    Par gotcha5832 dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/04/2014, 12h48
  2. Problème sur une jointure, enfin je crois
    Par zooffy dans le forum Développement
    Réponses: 6
    Dernier message: 07/02/2009, 11h44
  3. Réponses: 2
    Dernier message: 12/01/2008, 14h57
  4. Débutant SQL, problème sur une jointure censée exclure ??
    Par derfatypik dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/06/2005, 15h55
  5. limitation du nombre d'enregistrement sur une jointure
    Par coredump dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/06/2005, 16h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo