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 :

Somme de 2 requêtes


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    chargé d'études statistiques et marketing
    Inscrit en
    Avril 2015
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : chargé d'études statistiques et marketing

    Informations forums :
    Inscription : Avril 2015
    Messages : 74
    Par défaut Somme de 2 requêtes
    Bonjour

    j'ai besoin d'additionner les lignes de 2 requetes de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select * from D_offre_com o
    left join d_contrat_permanent p
    on p.numofr_init = o.numofr or p.numofr_der = o.numofr
    where (
    (p.datsor is null
    and o.codsitofr is null
    or o.codsitofr in ('54','57','59'))
    OR
    (o.datstaofr <= add_months('05/01/2023',36)
    and p.datsor is not null))
    +
    select *from D_offre_com where o.numofr not in (p.numofr_init union p.numofr_der)
    je ne sais pas comment on peut faire pour additionner la 2è partie après le + ?

    merci ;-)

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 443
    Par défaut
    Bonjour,
    qu'est-ce que tu entends par "additionner" ?
    Si tu veux que le résultat contienne les lignes des deux requêtes, il faut utilise une UNION:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select ...
    UNION
    select ...
    Et si tu ne veux pas supprimer les doublons, un UNION ALL sera (un peu) plus performant si les deux requêtes renvoient beaucoup de lignes.
    Par contre il faut remplacer les SELECT * par la liste des colonnes à renvoyer dans les deux requêtes, et que les deux listes soient cohérentes. Dans le cas contraire l'union ne fonctionnera pas.

    Si tu veux une addition au sens mathématique, il nous faut plus d'infos (le schéma des tables, un jeu de test et le résultat attendu).

    Tatayo.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 623
    Billets dans le blog
    10
    Par défaut
    Attention aussi aux combinaisons de AND et OR sans parenthèses : le résultat obtenu ne sera pas forcément celui attendu.
    Ne serait-ce que pour des raisons de lisibilité et de maintenance, il est préférable d'ajouter des parenthèses.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    OMG, une date passée en tant que chaines de caractères
    Quand tu passes une valeur date, il faut utiliser TO_DATE pour éviter une conversion implicite.

    Dans ton exemple, si le format nls date par défaut est mm/dd/yyyy, alors il s'agira du 1er mai 2023. Donc si tu veux que ce soit le 5 janvier 2023, précise-le explicitement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    add_months(to_date('05/01/2023', 'dd/mm/yyyy'),36)
    Sinon pour ton besoin, j'ai l'impression que tu peux juste ajouter une condition.

  5. #5
    Membre confirmé
    Femme Profil pro
    chargé d'études statistiques et marketing
    Inscrit en
    Avril 2015
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : chargé d'études statistiques et marketing

    Informations forums :
    Inscription : Avril 2015
    Messages : 74
    Par défaut
    Merci pour vos réponses

    oui c'était pour ajouter les lignes


    par contre, je me rends compte que ma requête tourne très longtemps
    est-ce qu'on peut écrire cette requête de manière plus performante d'après vous ?
    rappel ci-dessous de la requête où j'ai modifié un OR par un AND correspondant à ce que je cherche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select * from D_offre_com o
    left join d_contrat_permanent p
    on p.numofr_init = o.numofr or p.numofr_der = o.numofr
    where (
    (p.datsor is null
    and o.codsitofr is null
    or o.codsitofr in ('54','57','59'))
    and 
    (o.datstaofr <= add_months('05/01/2023',36)
    and p.datsor is not null)
    );

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 443
    Par défaut
    Sans connaitre la structure des tables, les éventuels indexes, sans le plan d'exécution, il est difficile pour nous de répondre.

    Tatayo.

Discussions similaires

  1. [AC-2003] somme conditionnelle dans requête de synthèse
    Par yupyupxav dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/02/2010, 19h40
  2. Opérations "Regroupement" et "Somme" dans les requêtes
    Par louisbru dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 27/02/2009, 19h29
  3. [A-03] Somme dans une requête
    Par mathilde50 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/11/2008, 17h57
  4. Calcul d'une différence de sommes dans une requête
    Par oohcalme dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 07/07/2008, 11h56
  5. Somme de deux requête en une en sql/access
    Par thepunky89 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/09/2007, 14h31

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