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
    Candidat au Club
    Homme Profil pro
    Entrepreneur
    Inscrit en
    janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : janvier 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Requete SQL dans laquelle je désire incorporé la date d'anniversaire de mes clients
    Bonjour.
    Je vous expose ma requête sur ce forum en espérant être sur la bonne page, n'étant pas un habitué des forums.
    En quelques mots voici ma situation.
    J'ai pour objectif de faire une publicité sur FB, et j'ai besoin d'une requete SQL particulière pour réaliser un choix clientèle ( lookalike ) qui correspond à ma base de données 2014-2020.
    Je travaille sur mac et ma boutique est sous Prestashop 1.7, lorsque je vais dans mon onglet commande et que j'exporte vers le gestionnaire SQL mes données la formule me donne ceci :

    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
    23
    SELECT SQL_CALC_FOUND_ROWS a.`id_order`, `reference`, `total_paid_tax_incl`, `payment`, a.`date_add` AS `date_add`
    , 
    		a.id_currency,
    		a.id_order AS id_pdf,
    		CONCAT(LEFT(c.`firstname`, 1), '. ', c.`lastname`) AS `customer`,
    		osl.`name` AS `osname`,
    		os.`color`,
    		IF((SELECT so.id_order FROM `ps_orders` so WHERE so.id_customer = a.id_customer AND so.id_order < a.id_order LIMIT 1) > 0, 0, 1) as new,
    		country_lang.name as cname,
    		IF(a.valid, 1, 0) badge_success, shop.name as shop_name 
    FROM `ps_orders` a 
     
     
    		LEFT JOIN `ps_customer` c ON (c.`id_customer` = a.`id_customer`)
    		INNER JOIN `ps_address` address ON address.id_address = a.id_address_delivery
    		INNER JOIN `ps_country` country ON address.id_country = country.id_country
    		INNER JOIN `ps_country_lang` country_lang ON (country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = 1)
    		LEFT JOIN `ps_order_state` os ON (os.`id_order_state` = a.`current_state`)
    		LEFT JOIN `ps_order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = 1) 
     LEFT JOIN `ps_shop` shop
                                ON a.`id_shop` = shop.`id_shop` WHERE 1  AND a.id_shop IN (1) 
     
     ORDER BY a.id_order DESC
    Cependant un élément important me manque, l'anniversaire, la date de naissance des mes clients ou leur âge, est-ce possible ?

    Après avoir passé la journée à chercher sur le net, fait des tests hasardeux et autres incantations magiques, je ne peux que me résoudre à vous embêter un peu et demander votre aide.
    Merci à vous pour votre temps.
    Au plaisir de vous lire.
    Hervé.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    5 308
    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 : 5 308
    Points : 15 696
    Points
    15 696
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Pour la date de naissance, pas de miracle, il faut la stocker dans la BDD

    Pour l'âge, PG propose la fonction age(timestamp, timestamp), applicable uniquement si vous avez la date de naissance bien sur
    cf. https://www.postgresqltutorial.com/postgresql-age/

  3. #3
    Candidat au Club
    Homme Profil pro
    Entrepreneur
    Inscrit en
    janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : janvier 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour escarfigue,

    Pour la date de naissance, pas de miracle, il faut la stocker dans la BDD
    Merci de ta réponse, bon je ne sais pas ce qu'est un BDD (Behavior Driven Development c'est bien cela n'est ce pas ?), en fouinant sur google, ce que j'en comprends c'est qu'il s'agit de la suite logique de mon code.
    Et j'avoue que je voudrais un miracle , je tente depuis une heure de tester différents endroits ou mettre la commande age(timestamp, timestamp), dans mon code sql mais à chaque test sur mon Back Office ça ne marche pas.

    Pour l'âge, PG propose la fonction age(timestamp, timestamp), applicable uniquement si vous avez la date de naissance bien sur
    cf. https://www.postgresqltutorial.com/postgresql-age/
    J'ai la date de naissance, toutes ces données étant mes anciens clients, la plupart ont remplis ce champ.
    Le plus difficile étant à présent d'installer cette requête dans le SQL afin que chaque clients aient sa date de naissance attribué dans mon tableau.

    Est ce qu'il te serait possible de m'indiquer où je dois mettre cette instruction dans mon code sql ( BDD si je comprends bien ), car depuis hier soir je fais du copier coller entre deux tableaux numbers... il ne m'en reste plus que 280 à faire glps... .
    Allez je m'y remets...
    Merci en tout cas d'avoir pris le temps de jeter un oei à mon problème, bon vendredi !
    Hervé.

  4. #4
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    mai 2002
    Messages
    19 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 19 399
    Points : 46 094
    Points
    46 094
    Par défaut
    Dans votre requête SELECT !

    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 * * * * *

  5. #5
    Candidat au Club
    Homme Profil pro
    Entrepreneur
    Inscrit en
    janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : janvier 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour SQL PRO, merci pour votre intervention.
    Dans votre requête SELECT !
    Je comprends bien, mais, en fait ou la placer dans ma requête SELECT pour l'âge ?

    Le code SQL que j'ai coller est en fait le résultat d'un seul effort de ma part, celui d'appuyer sur un bouton de mon site qui à transformé toutes les données de mes commandes ou de mon fichier client en une requête SQL.

    Je suis totalement démuni face à ce langage, et j'en suis navré.

    J'ai fini manuellement l'association de mes 580 clients, mais j'aimerai arriver au bout de ma démarche avec votre aide, si vous me le permettez.

    Je vais donc tenter d'insérer la fonction age(timestamp, timestamp ), dans ma requête SELECT juste après SELECT et je vous tient informer.

    Si vous avez quelques infos supplémentaires pour que je comprenne ou mettre cette fonction j'en serai ravi.
    Merci de votre aide en tout cas.
    Hervé.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    5 308
    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 : 5 308
    Points : 15 696
    Points
    15 696
    Billets dans le blog
    1
    Par défaut
    BDD comme Base De Données

    Par exemple, avec ce jeu d'essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with t1 (NumCli, NomCli, DdnCli) as
        (select 001, 'Dupond', '1961-02-20'   union all
         select 002, 'Durand', '1985-05-11'   union all
         select 003, 'Martin', '1982-07-16'   union all
         select 004, 'Iñacio', '1971-11-30')
    La requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select Numcli  as Num_Cli
         , NomCli  as Nom_Cli
         , DdnCli  as Date_Nais
         , age(now(), cast(DdnCli as timestamp))
    from t1     
    ;
    Donne le résultat suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    num_cli	nom_cli	date_nais	age
    1	Dupond	1961-02-20	58 years 10 mons 18 days 14:25:15.605782
    2	Durand	1985-05-11	34 years 7 mons 30 days 14:25:15.605782
    3	Martin	1982-07-16	37 years 5 mons 25 days 14:25:15.605782
    4	Iñacio	1971-11-30	48 years 1 mon 10 days 14:25:15.605782
    Si vous voulez apprendre le langage SQL, faites un tour ici : https://www.developpez.net/forums/d1...apprendre-sql/

  7. #7
    Candidat au Club
    Homme Profil pro
    Entrepreneur
    Inscrit en
    janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : janvier 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Re Mr escartegigue,

    BDD comme Base De Données
    Merci pour cette précision lol, bon j'étais à coté mais l'intention y était.

    Votre jeu d'essai m'a permis de comprendre le fonctionnement de la requête SQL, select permet d'aller chercher l'info et on lui dit ce que l'on veut en faire :
    select Numcli as Num_Cli
    Pour que ma formule fonctionne il faut que je sache comment mon programme sous prestashop nomme ou retient l'information de la date de naissance afin de pouvoir lui demander de la faire apparaitre dans mon tableau.
    Ce qui pourrait donner un truc du genre :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT SQL_CALC_FOUND_ROWS a.`id_order`, `reference`, `total_paid_tax_incl`, `payment`, a.`date_add` AS `date_add`, a. age(now( ), cast ( birthday as timestamp )
    , 
    		a.id_currency,
    		a.id_order AS id_pdf,
    		CONCAT(LEFT(c.`firstname`, 1), '. ', c.`lastname`) AS `customer`,
    		osl.`name` AS `osname`,
    		os.`color`,
    .....

    Est ce que je suis sur la bonne voie ?
    Merci à vous !
    Hervé.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    5 308
    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 : 5 308
    Points : 15 696
    Points
    15 696
    Billets dans le blog
    1
    Par défaut
    C'est possible, mais communiquez la requête complète qu'on en ait le cœur net

    quelques remarques :

    • n'hésitez pas à soigner la présentation des requêtes, plus c'est facile à lire, plus c'est facile à comprendre et donc à maintenir. Revenir à la ligne pour chaque colonne du select, chaque nouvelle jointure, chaque critère de regroupement ou de tri facilite la vie
    • à partir du moment où votre requête utilise plusieurs tables, utilisez systématiquement des alias de table devant chaque nom de colonne. Ça évite de se poser des questions sur l'origine de chacune d'entre elles.
    • pour les requêtes complexes, vous pouvez ajouter des commentaires dans le code en préfixant celui-ci par deux "tirets" : -- Ceci est un commentaire

  9. #9
    Candidat au Club
    Homme Profil pro
    Entrepreneur
    Inscrit en
    janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : janvier 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Re Mr Escartefigue,

    Ok, je comprends je vais améliorer ma présentation pour que je sois plus facilement lisible..
    Je ne comprends pas exactement tout mais les " à la ligne je vais tenter .

    J'ai fait un test de mon essai et la seule réponse obtenu fut

    Cette requête SQL n'a pas de résultat.
    Refus avec cette demande SQL :

    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
    24
    25
    26
    27
    28
    SELECT SQL_CALC_FOUND_ROWS 
    a.`id_order`, 
    `reference`, 
    `total_paid_tax_incl`, 
    `payment`,
     a.`date_add` AS `date_add`, 
    `age(now)`
    		a.id_currency,
    		a.id_order AS id_pdf,
    		CONCAT(LEFT(c.`firstname`, 1), '. ', c.`lastname`) AS `customer`,
    		osl.`name` AS `osname`,
    		os.`color`,
    		IF((SELECT so.id_order FROM `ps_orders` so WHERE so.id_customer = a.id_customer AND so.id_order < a.id_order LIMIT 1) > 0, 0, 1) as new,
    		country_lang.name as cname,
    		IF(a.valid, 1, 0) badge_success, shop.name as shop_name 
    FROM `ps_orders` a 
     
     
    		LEFT JOIN `ps_customer` c ON (c.`id_customer` = a.`id_customer`)
    		INNER JOIN `ps_address` address ON address.id_address = a.id_address_delivery
    		INNER JOIN `ps_country` country ON address.id_country = country.id_country
    		INNER JOIN `ps_country_lang` country_lang ON (country.`id_country` = country_lang.`id_country` AND country_lang.`id_lang` = 1)
    		LEFT JOIN `ps_order_state` os ON (os.`id_order_state` = a.`current_state`)
    		LEFT JOIN `ps_order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = 1) 
     LEFT JOIN `ps_shop` shop
                                ON a.`id_shop` = shop.`id_shop` WHERE 1  AND a.id_shop IN (1) 
     
     ORDER BY a.id_order DESC

    Mais je pense que je fais fausse route, dans mon tableau j'ai besoin qu'apparaisse
    le nom,
    le prénom,
    l'âge,
    l'adresse,
    l'email,
    la valeur de la commande,
    le code postal,
    la ville,
    le genre et le numéro de téléphone
    Donc en fait c'est un mix avec mon carnet client et mon carnet de commande... Bwarff.
    Je vais chercher je reviens .
    Merci de votre aide en tout cas.

  10. #10
    Candidat au Club
    Homme Profil pro
    Entrepreneur
    Inscrit en
    janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : janvier 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Changement de cap mon capitaine :D
    Je reviens car j'ai peut être trouvé une façon plus simple et plus pratique pour obtenir ce que je veux .

    Reste à savoir si cela va avoir du sens, comme je le disais précédemment il me faut un tableau avec toutes mes infos clients mais avec en plus leur montant de commande...

    J'ai donc obtenu cette requête SQL qui m'apporte 90% des infos dont j'ai besoin :
    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
    24
    25
    SELECT
    pc.`id_customer`,
    pc.`email`,
    pa.`company`,
    pc.`siret`,
    pc.`id_gender`,
    pa.`firstname`,
    pa.`lastname`,
    pa.`address1`,
    pa.`address2`,
    pa.`postcode`,
    pa.`city`,
    pa.`phone`,
    pa.`phone_mobile`,
    pc.`birthday`,
    pc.`newsletter`,
    pc.`active`
    FROM ps_address pa
    LEFT JOIN ps_customer pc ON pa.`id_customer`=pc.`id_customer`
    WHERE
    pa.`deleted`=0
    AND pc.`email` != ''
    AND pa.`id_supplier` = 0
    AND pa.`id_manufacturer` = 0
    GROUP BY pa.`address1`

    Je n'ai donc plus l'anniversaire à trouver mais le montant de leur commande , mieux non ?

  11. #11
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    5 308
    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 : 5 308
    Points : 15 696
    Points
    15 696
    Billets dans le blog
    1
    Par défaut
    Bonsoir

    La dernière requête utilise une jointure OUTER, mais comme il y a une restriction qui consiste à vérifier que l'email est renseigné sur l'une des colonnes de la table OUTER, cela revient à utiliser une jointure INNER.
    Ce n'est probablement pas volontaire, à vérifier

    Par ailleurs quel est l'intérêt de age(now)

    Enfin la clause GROUP BY est invalide car incohérente avec la clause SELECT et inutile puisqu'il n'y a aucun agrégat

  12. #12
    Candidat au Club
    Homme Profil pro
    Entrepreneur
    Inscrit en
    janvier 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Entrepreneur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : janvier 2020
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour Mr escartefique.

    La dernière requête utilise une jointure OUTER, mais comme il y a une restriction qui consiste à vérifier que l'email est renseigné sur l'une des colonnes de la table OUTER, cela revient à utiliser une jointure INNER.
    Ce n'est probablement pas volontaire, à vérifier
    Je vais vérifier cela :p, mais j'avoue que tant que cela m'amène au résultat je suis satisfait, mais pour le sport je vais regarder si je peux transformer cette jointure OUTER en INNER .

    Par ailleurs quel est l'intérêt de age(now)
    En fait je n'ai plus besoin de l'âge à présent mais du montant de leurs commandes
    Je n'ai donc plus l'anniversaire à trouver mais le montant de leur commande , mieux non ?
    Enfin la clause GROUP BY est invalide car incohérente avec la clause SELECT et inutile puisqu'il n'y a aucun agrégat
    Je vais la supprimer et voir si cela à un impact particulier sur mon tableau.
    Merci !! Bon samedi !
    Je reviens vers vous pour vous informer des changements.
    Hervé.

Discussions similaires

  1. Réponses: 13
    Dernier message: 23/09/2011, 19h24
  2. Importer valeur requete SQL dans une Requete
    Par qbihlmaier dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 21/03/2006, 15h24
  3. Réponses: 1
    Dernier message: 25/10/2005, 13h18
  4. Recuperer un enregistrement de requete SQL dans une variable
    Par kleenex dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/09/2005, 16h59
  5. résultat d'une requete SQL dans un tableau en JSP
    Par Paradoxys dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 06/04/2005, 17h17

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