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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2018
    Messages : 20
    Points : 18
    Points
    18

    Par défaut Comparer les lignes d'une base sql

    Bonjour,


    Je dispose d'une base de donnée sql avec comme variables :

    - idclient_do (correspond a l'identifiant du client)

    - jour (renvoie le jour de la commande)

    - le détail des articles acheté (Renvoi tous les codes des articles achetés par jour et par client,
    exemple d'une ligne : 1006,1038,1099,19124,42368,39063,65157)

    - le nombre d'article acheté

    ce que je voudrais c'est de voir si un client à passer plusieurs fois la même commande dans l'année.

    Merci d'avance et bonne journée.

    Bien cordialement,

    Ali

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Cyber sécurité
    Inscrit en
    mai 2004
    Messages
    9 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Cyber sécurité

    Informations forums :
    Inscription : mai 2004
    Messages : 9 469
    Points : 27 919
    Points
    27 919

    Par défaut

    Bonjour,

    Quel est ton soucis :
    - la requête (l'algo, qu'est-ce qu'il faut comparer, ...)
    - la traduction en SQL
    - autre
    Modérateur "C", "Informatique Générale & Hardware" et "Unix"
    Les règles du forum

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2018
    Messages : 20
    Points : 18
    Points
    18

    Par défaut

    En faite je veux essayer de déterminer pour chaque client s'il a passer plusieurs fois la même commande au cours d'une année.

    Un exemple : le client 15300 achète le 2011-01-01 les articles 134,8765,4362

    Ce que je voudrais c'est donc de déterminer si le client 15300 a passé la même commande un autre jour de l'année 2011

  4. #4
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 875
    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 : 3 875
    Points : 8 868
    Points
    8 868
    Billets dans le blog
    1

    Par défaut

    C'est tout à fait possible et c'est même très simple, sous réserve que ce que vous mentionnez ci-dessous :
    Citation Envoyé par ali3529 Voir le message
    - le détail des articles acheté (Renvoi tous les codes des articles achetés par jour et par client,
    exemple d'une ligne : 1006,1038,1099,19124,42368,39063,65157)
    Se traduit par plusieurs occurrences de code articles et de quantités correspondantes dans une table dédiée, et non pas (et surout pas!) par une liste de code articles dans un attribut unique !

    Communiquez la description de vos tables (ordres create table) pour en avoir le cœur net.

  5. #5
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    18 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 18 172
    Points : 42 504
    Points
    42 504

    Par défaut

    Il faut comparer les commandes avec client identique et n° différent puis faire une comparaison ensembliste sur les détail des commandes.

    merci de respecter la charte de postage la prochaine fois... => https://www.developpez.net/forums/a6...gage-sql-lire/

    tables test :
    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
    CREATE TABLE CLIENT 
    (CLI_ID           INT PRIMARY KEY,
     CLI_NOM          VARCHAR(60));
     
    CREATE TABLE PRODUIT
    (PRD_ID           INT PRIMARY KEY,
     PRD_NOM          VARCHAR(60));
     
    CREATE TABLE COMMANDE
    (CMD_ID           INT PRIMARY KEY,
     CLI_ID           INT FOREIGN KEY REFERENCES CLIENT (CLI_ID),
     CMD_DATE         DATE NOT NULL);
     
    CREATE TABLE COMMANDE_DETAIL
    (CDD_ID           INT PRIMARY KEY,
     CMD_ID           INT NOT NULL FOREIGN KEY REFERENCES COMMANDE (CMD_ID),
     PRD_ID           INT NOT NULL FOREIGN KEY REFERENCES PRODUIT (PRD_ID),
     CDD_QUANTITE     FLOAT NOT NULL DEFAULT 1);
    Données tests :
    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
    INSERT INTO CLIENT 
    VALUES (1, 'Claude'), (2, 'Camille'), (3, 'Corinne'), (4, 'Céline'), (5, 'Charles');
     
    INSERT INTO PRODUIT 
    VALUES (11, 'Pastèque'), (22, 'Potiron'), (33, 'Poivron'), (44, 'Paprika'), (55, 'Poire'), (66, 'Pamplemousse');
     
    INSERT INTO COMMANDE 
    VALUES (101, 1, '2017-01-01'), --> une seule facture pour le client 1
           (201, 2, '2017-02-01'), (202, 2, '2017-02-01'), 
           (301, 3, '2017-03-01'), (302, 3, '2017-03-02'), (303, 3, '2017-03-03'), 
           (401, 4, '2017-04-01'), (402, 4, '2017-04-02'),
           (501, 5, '2017-05-01');
     
    INSERT INTO COMMANDE_DETAIL 
    VALUES (1101, 101, 11, 1), --> un seul produit pour la seule facture du client 1
           (2201, 201, 22, 1), (2202, 201, 33, 1), -- 2 produits pour la facture 1 du client 2
           (2203, 202, 44, 1), --> un seul produit pour la facture 2 du client 1
           (3301, 301, 11, 1), (3302, 301, 22, 1), -->  2 produits pour la facture 1 du client 3
           (3303, 302, 11, 1), (3304, 302, 22, 1), -->  2 produits pour la facture 2 du client 3 (identique à la précédente)
           (3305, 303, 11, 1), -->  1 produit pour la facture 3 du client 3
           (4401, 401, 55, 1), -->  1 produit pour la facture 1 du client 4
           (4402, 402, 55, 1); -->  1 produit pour la facture 1 du client 4 (identique à la précédente)
    la comparaison basique :
    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
    SELECT DISTINCT C1.CLI_ID
    FROM   COMMANDE AS C1
           JOIN COMMANDE AS C2
                ON C1.CLI_ID = C2.CLI_ID AND C1.CMD_ID > C2.CMD_ID
    WHERE  NOT EXISTS(SELECT PRD_ID, CDD_QUANTITE
                      FROM   COMMANDE_DETAIL AS CD1
                      WHERE  CD1.CMD_ID = C1.CMD_ID
                      EXCEPT
                      SELECT PRD_ID, CDD_QUANTITE
                      FROM   COMMANDE_DETAIL AS CD2
                      WHERE  CD2.CMD_ID = C2.CMD_ID
                      UNION ALL
                      SELECT PRD_ID, CDD_QUANTITE
                      FROM   COMMANDE_DETAIL AS CD3
                      WHERE  CD3.CMD_ID = C2.CMD_ID
                      EXCEPT
                      SELECT PRD_ID, CDD_QUANTITE
                      FROM   COMMANDE_DETAIL AS CD4
                      WHERE  CD4.CMD_ID = C1.CMD_ID)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2018
    Messages : 20
    Points : 18
    Points
    18

    Par défaut

    Je vous remercie pour vos retour, au final avec ce code j'arrive à avoir le nombre distinct de commande qu'il passe et donc déduit le nombre de même commande qu'il a passé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select  count(distinct article) as commande_distinct, ma.idclient_do
    from (select idclient_do,
           jour,
           group_concat(article) as article,
           count(*) as nb_produit
    from mutlu.ventes_2011_5
    group by idclient_do, jour) as ma
    group by idclient_do;

    le seul hic je dirai, c'est que, est-ce-que le distinct considère la commande "112,115" de la même manière que "115,112" ?

    Merci encore et bonne journée.

    Ali

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 932
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 932
    Points : 10 132
    Points
    10 132

    Par défaut

    Bonjour,

    si votre base est correctement modélisée, oui, sinon, pas forcément !

    répondez à la question d'Escartefigue : indiquez nous la structure de vos tables, on pourra mieux vous répondre.

  8. #8
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 875
    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 : 3 875
    Points : 8 868
    Points
    8 868
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par ali3529 Voir le message
    Ce que je voudrais c'est de voir si un client à passer plusieurs fois la même commande dans l'année.
    Outre la description des tables qui est manquante, il faut aussi préciser s'il faut considérer ou non la quantité commandée dans la comparaison

    Par exemple, pour un client, j'ai les commandes suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    --- Date ---!--article --!-- Qté --!
     2018-01-05 ! machin     !   10    !
     2018-01-12 ! truc       !   20    !
     2018-01-20 ! truc       !   17    !
     2018-02-05 ! machin     !   10    !
    Si la quantité est à considérer, alors il y a doublon uniquement pour les commandes de l'article "machin", sinon il y a deux doublons

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

Discussions similaires

  1. Attacher les tables d'une base SQL server 2000
    Par dimitrak dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/03/2008, 16h08
  2. comparer les résultats d'une requete sql
    Par oceane751 dans le forum JDBC
    Réponses: 26
    Dernier message: 05/03/2008, 18h05
  3. Récupérer les lignes d'une procédure SQL Server dans le programme VB.NET
    Par Mikelester12 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 30/07/2007, 11h33
  4. [SQL] Supprimer les lignes d'une table sql
    Par radhwene dans le forum PHP & SGBD
    Réponses: 1
    Dernier message: 28/06/2007, 11h48
  5. Droits sur les vues d'une base SQL server 2000
    Par mioux dans le forum MS SQL-Server
    Réponses: 4
    Dernier message: 30/04/2007, 16h13

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