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 de valeurs sur 2 lignes


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Soustraction de valeurs sur 2 lignes
    Bonjour,
    j'ai une grande table A contenant notamment les champs ref,qte et prix. Le champs ref est presque toujours présent en double dans la table et, lorsque c'est le cas, je souhaite faire la différence entre les 2 champs qte correspondants (et pareil pour le prix), puis d'autre calculs telles une division
    Voici un extrait de cette table, chaque champ étant séparé par une virgule:
    ref,qte,prix
    6783,728,3.6
    4123,518,16.7
    4123,416,14.85
    7829,63,25.5

    Dans cet extrait, on voit que la ref 4123 apparaît sur 2 lignes. J'aimerai obtenir une seule ligne, pour toutes les ref apparaissant sur 2 lignes, contenant les différences de qte (518-416), de prx (16.7-14.85) et le rapport ces 2 différences:

    ref, qte1-qte2,prix1-prix2,(qte1-qte2)/(prix1-prix2)

    J'y arrive très bien si j'avais à faire la somme mais pour la différence et la division, je sèche. Dans le cas d'une somme, je fais ça:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select ref,sum(qte)
    from A 
    group by ref
    having(count(*)>1)

  2. #2
    Modérateur

    Retour aux années collège...
    La somme est commutative (a+b=b+a) mais pas la différence (a-b!=b-a).
    Donc la première chose à identifier est quelle ligne prendre pour le premier terme de l'opération et pour quelle raison.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  3. #3
    Membre régulier
    BONJOUR al1_24
    Merci beaucoup pour votre réponse!
    Au final, ce qui m'intéresse est le rapport entre ces 2 différences et comme (a-b)/(c-d) = (b-a)/(d-c), ...
    Donc, prenons la 1ère ligne pour le premièr terme et la 2ème ligne pour le 2ème terme SVP.
    Cordialement

  4. #4
    Modérateur

    Qu'est ce qui fait qu'une ligne est la première ou la deuxième ?
    Une table n'est pas ordonnée.
    Une requête ne l'est que par l'utilisation de la clause ORDER BY.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  5. #5
    Membre régulier
    Bonjour,
    Quand je fais ça:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select * from A where ref in
    (select ref,sum(qte)
    from A 
    group by ref
    having(count(*)>1))
    order by ref


    Les lignes avec un ref identiques s'affichent les une après les autres. La première ligne est la première affichée et la deuxième est la deuxième. Pas sûr de bien vous suivre!

  6. #6
    Rédacteur

    Lisez l'article que j'ai écrit à ce sujet :
    https://sqlpro.developpez.com/cours/...az/erreurs/#L5

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  7. #7
    Modérateur

    En supposant que le prix minimum correspond toujours à la quantité minimale :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      select ref
           , case count(*) when 1 then max(qte)  else max(qte)  - min(qte)  end as qte
           , case count(*) when 1 then max(prix) else max(prix) - min(prix) end as prix
        from A 
    group by ref

###raw>template_hook.ano_emploi###