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 :

Soustraction entre 2 select


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut Soustraction entre 2 select
    Bonjour à tous, je vais tenter de décrire clairement omn problème :

    je souhaiterais obtenir via une requête SQL, le résultat d'une soustraction entre 2 enregistrements d'une même table.

    dans mon cas, j'ai une table qui liste des relevés de compteurs kilométriques avec la structure suivante

    idCompteur |Date_releve | valeur_relevee
    1 |01/01/2008 | 25
    1 |01/02/2008 | 50

    je souhaiterais donc dans ma requête SQL effectuer une soustration entre le relevé du 01/02/2008 et celui du 01/01/2008

    pourriez-vous m'aider pour la génération de la requête SQL ?

    merci d'avance

    Zyco

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    Avec quel SGBD ? Quelle version ?

  3. #3
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut
    tjrs sur tes problèmes de relévés

    cependant, le SQL sert à extraire des données, faire des calculs sur l'enregistrement en cours, mais je vois pas bien comment tu peux envisager de faire des calculs entre 2 enregistrements.

    tu pars déjà de l'hypothèse qu'ils sont dans l'ordre que tu attends.

    sachant, que tu es sous CR, pourquoi ne fais tu pas ce calcul dans le report?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Eh oui, je suis démasqué ! toujours mes problèmes de compteur... Donc pour Al SGBDR = ORACLE, et l'application sous Crystal Reports, mais c'est une longue histoire...

    Si je ne le fais pas sous Crystal c'est parce que là encore, je ne vois pas d'autre moyen de faire que la méthode suivante :
    - Créer un sous etat pour obtenir la valeur du mois m-1
    - Créer un autre sous etat pour obtenir la valeur m, à laquelle je soustrait m-1

    je vais crouler sous les sous-etats ! A moins que vous n'ayez une astuce ?, auquel cas je suis preneur...

    Merci d'avance

    Zyco

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    En prenant pour hypothèse que tu as un relevé par jour maxi et que {idCompteur, date_releve} constitue la clé primaire de la table des relevés notée T_Releve :

    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
    SELECT 
    	R.idCompteur, 
    	R.Date_releve, 
    	R.valeur_relevee, 
    	R_Prec.date_releve as date_releve_prec, 
    	R.valeur_relevee - R_Prec.valeur_relevee as Ecart_Precedent_Releve
    FROM T_Releve R
    	LEFT JOIN T_Releve R_Prec
    		ON R.idCompteur = R_Prec.idCompteur 
    		AND R.Date_Releve > R_Prec.Date_Releve
    		AND R_Prec.Date_Releve = (	SELECT MAX(Date_releve)
    						FROM T_Releve
    						WHERE idCompteur = R.idCompteur 
    						AND date_releve < R.Date_Releve )
    ORDER BY idCompteur, R.Date_Releve desc
    te donnera la liste des relevés avec l'écart entre le relevé et son relevé précédent. Si un relevé précédent n'existe pas, tu obtiens du NULL du fait de la jointure externe.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Waow ! un grand merci pour cette magnifique requête, je teste et vous tiendrais informé du résultat.

    Zyco

  7. #7
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Ce sera bien si elle donne le résultat attendu...

    Mais tu n'as pas confirmé ou infirmé mon hypothèse. Si le couple date/idCompte est bien PK alors je garantis que la requête donnera le résultat escompté.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Eh bien je ne parviens pas à faire fonctionner la requête, j'obtiens une erreur 'ORA-01799:une colonne ne peut être jointe extérieurement à une sous interrogation' et là j'avoue que je ne vois pas ce qui cloche...

    Dommage parce qu'à la lecture de la requête ça semblait plutôt évident...

    Si vous avez une idée...

    merci d'avance

    Zyco

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Votre version d'oracle ne doit pas supporter une clause de jointure externe qui utilise une sous requête corrélée, le message d'erreur est explicite.

    J'ai testé cette requête sur SQL Server sans problème mais dans votre cas, il faut trouver une reformulation qui contourne la limitation.

    J'y réfléchis.

    edit : tentez déjà un inner join pour voir si la limitation est liée à la jointure externe ou globalement à l'utilisation d'une sous requête corrélée dans la clause de jointure (externe ou pas). L'inner join vous fera perdre les lignes correspondant aux premiers relevé de compteur si celà fonctionne mais nous éclairera sur la limitation réelle et la manière de contourner.

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Voilà celle ci devrait passer votre limitation en ayant peut être même un meilleur plan d'execution. Elle suit la même philosophie avec une tournure légèrement différente.

    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
    SELECT 
    	R.idCompteur, 
    	R.Date_releve, 
    	R.valeur_relevee, 
    	R_Prec.date_releve AS date_releve_prec, 
    	R.valeur_relevee - R_Prec.valeur_relevee AS Ecart_Precedent_Releve
    FROM T_Releve R
    	LEFT JOIN T_Releve R_Prec
    		ON R.idCompteur = R_Prec.idCompteur 
    		AND R.Date_Releve > R_Prec.Date_Releve
    		LEFT JOIN T_Releve R_Prec2
    			ON R_Prec2.idCompteur = R.idCompteur 
    			AND R_Prec2.date_releve < R.date_releve 
    			AND R_Prec2.date_releve > R_Prec.date_releve 
    WHERE R_Prec2.date_releve is NULL
    ORDER BY idCompteur, R.Date_Releve DESC
    Pour information, j'ai reformulé le "max" de la clause de jointure externe en une autre jointure externe qui cherche la non existence (where ... is null) d'une valeur de relevé précédent plus récent pour le relevé directement précédent. Bon d'accord c'est totalement inintelligible en français...

  11. #11
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    SUPER ! ça marche impec, voilà qui vient de diviser par 3 le nombre de sous-etats que j'avais prévu d'intégrer dans mon etat !!!

    Si je pouvais, j'te ferais la bise "vmolines" ;-)

    encore merci pour tout (et à bientôt peut-être)

    Zyco

  12. #12
    say
    say est déconnecté
    Membre éprouvé
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 258
    Points
    1 258
    Par défaut
    Attention aux trop grandes familiarités

    tag please

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

Discussions similaires

  1. select d'une soustraction entre 2 valeurs puis insert
    Par vinch999 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/04/2011, 17h23
  2. Soustraction entre deux dates
    Par Jayceblaster dans le forum Delphi
    Réponses: 8
    Dernier message: 17/02/2007, 14h10
  3. Réponses: 2
    Dernier message: 22/01/2006, 02h11
  4. Soustraction entre deux dates
    Par franculo_caoulene dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 20/01/2006, 11h59
  5. Soustraction entre 2 tables...
    Par Mathouxxx dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/10/2005, 23h38

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