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

MySQL Discussion :

Retourner une ligne si une autre ligne est présente


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut Retourner une ligne si une autre ligne est présente
    Bonjour à tous,

    Je dispose d'une table "transactions" sur la quelle je souhaite effectuer une recherche.
    Cette table comporte un champs "client", "date" d'achat, "montant" de la transaction et "renouvellement". Les montants correspondent à deux abonnements, 30€ pour un mois et 200€ pour un an.
    Je souhaite comme résultat les chiffres d'affaire groupés par mois provenant des renouvellements 1 mois vers 1 mois ou 12 mois vers 12 mois (afin de mieux connaître le profil de mes clients)
    La difficulté vient du fait que le champs "renouvellement" vaut 1 aussi dans le cas 1 mois vers 12 mois.

    J'ai ici une ébauche de requête qui ne fait pas de distinctions des cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT
    	SUM(montant) AS CA,
    	DATE_FORMAT(gen_date, '%M %Y') AS mois
    FROM
    	transactions
    WHERE
    	montant = 30 OR montant = 200
    	AND renouvellement = 1
    GROUP BY
    	DATE_FORMAT(gen_date, '%M %Y')
    ORDER BY
    	DATE_FORMAT(gen_date, '%Y %m')
    	DESC
    qui me donne comme résultat :

    CA mois
    55489 December 2009
    356874 November 2009
    301456 October 2009
    203727 September 2009
    15487 August 2009
    Le problème est que je ne vois pas comment dire en mysql "Prends en compte cette achat, si l'achat précédent du même client est du même montant". Cela ressemble beaucoup à du procédural.
    Si je devais reformuler mon problème autrement :
    Comment dire en mysql : renvoie moi cette ligne si la ligne juste au dessus rempli certains critères.

    Serait-ce une histoire de curseur? Ou y a-t-il beaucoup plus simple?

    Je vous remercie par avance.

  2. #2
    Membre averti Avatar de Macfurp
    Inscrit en
    Octobre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 62
    Par défaut
    Bonjour,

    sauf erreur de compréhension de ma part, je pense que tu pourrais t'en sortir avec une requête corrélée à compléter avec tes critères additionnels, ce qui te permettrait d'exclure les lignes qui correspondent au même client, d'un montant différent, sur les critères de date, etc...

    Code SQL : 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
     
    SELECT
            SUM(A.montant) AS CA,
    	DATE_FORMAT(A.gen_date, '%M %Y') AS mois
    FROM
    	transactions A
    WHERE
    	A.montant = 30 OR A.montant = 200
    	AND A.renouvellement = 1
     
            AND NOT EXISTS 
            ( SELECT 'X' from transactions B
               WHERE B.renouvellement = 1 
                   AND B.montant in ( 30 , 200 )
                   AND A.CLIENT = B.CLIENT
                   AND A.montant <> B.montant
                   AND ... etc
              )   
    GROUP BY
    	CLIENT, DATE_FORMAT(gen_date, '%M %Y')
    ORDER BY
    	CLIENT DATE_FORMAT(gen_date, '%Y %m')
    	DESC

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 19
    Par défaut
    Merci de ta réponse. J'avais en effet regardé du côté de NOT EXIST, mais sans trouver quelques choses de concluant. Ta solution en l'adaptant un peu me donne satisfaction. Pendant ce temps, j'ai pu trouver une solution en utilisant les jointures qui sont vraiment très pratique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select auser,a.montant,a.date,b.montant,b.date
    from
    (SELECT * FROM transactions where montant=30) a
    join
    (SELECT * FROM transactions where montant=30 or montant=200) b
    on a.user=b.user and a.date=DATE_SUB(b.date, INTERVAL -1 MONTH)
    where a.montnant=b.montant
    order by a.user,a.date
    Il ne me reste plus qu'à regrouper tout cela par mois. Encore merci pour ta réponse.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/02/2014, 14h33
  2. Réponses: 6
    Dernier message: 10/07/2012, 17h02
  3. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 14h35
  4. afficher toutes les lignes d'une colonne d'une BDD + infos relatives à 1 ligne
    Par ju0123456789 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/02/2009, 20h20
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 14h48

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