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

Langage SQL Discussion :

Pb pour ramener un champ correspondant à un max d'un autre


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Pb pour ramener un champ correspondant à un max d'un autre
    Bonjour tout le monde,

    Voilà, j'ai un petit pb et je cherche un Dieu de SQL pour me répondre.

    Voici ma requête :

    ( select
    sa.ACTION_ID DERNIER_CONTACT_ID,
    max(sa.DATE_SITUATION) DATE_SITUATION
    from SOUSCRIPTEURS_ACTIONS sa
    where
    sa.PERSON_ID = sc.PERSON_ID
    and sa.SOUSCRIPT_ID = 30248202
    and sa.DATE_SITUATION <= trunc(SYSDATE)
    group by sa.ACTION_ID
    )

    ça marche bien mais je n'aimerai pas ramener le champ DATE_SITUATION

    en fait cette requête est déjà imbriquée dans une autre et si jamais
    je casse celle ci avec un sous-select :
    (select toto.DERNIER_CONTACT_ID
    from
    ( select
    sa.ACTION_ID DERNIER_CONTACT_ID,
    max(sa.DATE_SITUATION) DATE_SITUATION
    from SOUSCRIPTEURS_ACTIONS sa
    where
    sa.PERSON_ID = sc.PERSON_ID
    and sa.SOUSCRIPT_ID = 30248202
    and sa.DATE_SITUATION <= trunc(SYSDATE)
    group by sa.ACTION_ID
    ) toto ) DERNIER_CONTACT_ID

    alors ma requête plante car il me dit qu'il ne connait pas le champ sc.PERSON_ID (sc est l'alias d'une table qui est dans le from de ma requpete principale !)

    QQ' un a une idée ????

    MERCI D'AVANCE !!

    Olivier

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je pense n'avoir pas bien compris la question car pour
    je n'aimerai pas ramener le champ DATE_SITUATION
    , il suffit de retirer cette partie du SELECT ...

  3. #3
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut Re: Pb pour ramener un champ correspondant à un max d'un aut
    Les requêtes peuvent lire dans les sous-requêtes mais pas l'inverse !

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    bah non retirer DATE_SITUATION ne marche pas car on souhaite la ligne avec un max sur DATE_SITUATION...

    sinon on m'a dit par ailleurs qu'il fallait passer par une fonction stockée en base

  5. #5
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Est-ce que tu pourrais expliquer clairement ce que tu veux ...
    Je tente, au cas où (finalement le titre est plus clair que les explications)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT sa.ACTION_ID DERNIER_CONTACT_ID
    FROM   SOUSCRIPTEURS_ACTIONS sa 
    WHERE  sa.PERSON_ID = sc.PERSON_ID 
    AND    sa.SOUSCRIPT_ID = 30248202 
    AND    sa.DATE_SITUATION = (SELECT   max(sa.DATE_SITUATION) 
                                FROM     SOUSCRIPTEURS_ACTIONS sm 
                                WHERE    sa.PERSON_ID = sma.PERSON_ID 
                                AND      sa.SOUSCRIPT_ID = 30248202 
                                AND      sa.DATE_SITUATION <= trunc(SYSDATE) 
                                GROUP BY sa.ACTION_ID)
    qui ne marche qu'à la condition que si DATE_SITUATION est unique et si cette requête est un sous SELECT définissant sc

    Si c'est bien cela, il y a des tas de façons différentes de résoudre ce problème (avec un auto-jointure, avec un SELECT des max dans le FROM...)

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 7
    Points : 6
    Points
    6
    Par défaut OK MERCI
    Oui en effet la dernière solution doit marcher... j'essaye de suite ;

    je n'avais pas pensé à mettre ma clause max dans le where !


    Merci

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 7
    Points : 6
    Points
    6
    Par défaut MERCI
    Et oui ça marche maintenant (àqq modifs mineures près) ;
    je vous mets ma requête finale pour ceux que ça intéresse :

    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
    	SELECT
    	  sc.CONTACT_ID,
    	  sc.SOCIETE_ID,
    	  sc.PERSON_ID,
    	  nvl(pers.NOM_COMPLET, pers.NOM)	NOM_COMPLET,
       	  sc.B_PRINCIPAL,			
    	  sc.FONCTION_ID,			
    	  sc.FONCTION,			
    	  sc.LANG_ID,					  sc.NATIONALITE_ID,
    	  sc.CONTACT_GROUPE_INIT_ID,
    	  sa.ACTION_ID 	                        DERNIER_CONTACT_ID,
      	  sa.DATE_SITUATION 	        DERNIER_CONTACT,
       	  sc.DATE_FIN,			
    	  sc.ACTIVITE,				
    	  sc.NOTES,
    	  adr.ADRESSE_ID,
    	  adr.ADR0,
    	  adr.ADR1,
    	  adr.CODEPOSTAL,
    	  adr.VILLE,
    	  adr.PAYS_ID,
    	  tm1.NUM_TEL_MAIL		  NUM_TEL,
    	  tm2.NUM_TEL_MAIL		  NUM_FAX,
    	  tm3.NUM_TEL_MAIL		  NUM_MAIL
    	FROM 
    	  SOUSCRIPTEURS_CONTACTS sc,
    	  ADRESSES adr,
    	  TEL_MAIL tm1,
    	  TEL_MAIL tm2,
    	  TEL_MAIL tm3,
    	  PERSONNES pers,
    	  SOUSCRIPTEURS_ACTIONS sa
    	WHERE 
    	        sc.SOCIETE_ID = 30248202
    	  and pers.PERSON_ID = sc.PERSON_ID
    	  and sa.SOUSCRIPT_ID = 30248202
    	  and sa.PERSON_ID = sc.PERSON_ID 
    	  and sa.DATE_SITUATION = 
                           (SELECT max(sam.DATE_SITUATION) 
    	        FROM SOUSCRIPTEURS_ACTIONS sam 
    	        WHERE sam.SOUSCRIPT_ID = 30248202
    	             and sam.PERSON_ID  = sa.PERSON_ID
    	             and sam.DATE_SITUATION <= trunc(SYSDATE) 
                           )
    	  and adr.OWNER_ID(+) = sc.PERSON_ID
    	  and adr.PARDEFAUT(+) = 'Y'
    	  and tm1.OWNER_ID(+) = sc.PERSON_ID
    	  and tm1.CATEG_TEL(+) = 'T'
    	  and tm1.PARDEFAUT(+) = 'Y'
    	  and tm2.OWNER_ID(+) = sc.PERSON_ID
    	  and tm2.CATEG_TEL(+) = 'F'
    	  and tm2.PARDEFAUT(+) = 'Y'
    	  and tm3.OWNER_ID(+) = sc.PERSON_ID
    	  and tm3.CATEG_TEL(+) = 'E'
    	  and tm3.PARDEFAUT(+) = 'Y'
    	ORDER BY
    	  sc.B_PRINCIPAL desc,
    	  NOM_COMPLET

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL-5.1] Récupérer la valeur d'un champ correspondant au MAX d'un autre
    Par sergeh dans le forum Requêtes
    Réponses: 0
    Dernier message: 26/12/2014, 10h05
  2. Réponses: 15
    Dernier message: 30/05/2013, 17h55
  3. Réponses: 25
    Dernier message: 16/06/2009, 11h36
  4. Réponses: 5
    Dernier message: 04/12/2008, 11h58
  5. Requête avec max date et champs correspondants
    Par sl1980 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2007, 00h01

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