Partage
  • Partager sur Facebook
  • Partager sur Twitter

SQL Calculer l'écart en jours entre 2 commandes

    8 août 2018 à 15:18:18

    Bonjour, 

    J'aimerais réaliser une requête SQL qui permette pour chaque client (customer_email), de connaître l'écart en jours entre la dernière et avant_dernière commande. Ce qui sous-entend de devoir utiliser un filtre qui permette de sélectionner uniquement les clients qui ont passé au moins deux commandes (increment_id)

    Les dates de commandes sont stockées sous format DATETIME et sont dans la colonne created_at de la table nommée sales_order. 

    La table sales_order se présente ainsi de la façon suivante (il y a d'autres colonnes, mais je mets uniquement les colonnes utiles): 

    customer_email  created_at   increment_id

    xx@gmail.com    01-01-2000          1

    yy@gmail.com    01-01-2000          2

    yy@gmail.com    07-01-2000          3

    xx@gmail.com    08-01-2000          4

    zz@gmail.com    10-01-2000          5

    xx@gmail.com    11-01-2000          6

    Et je voudrais que la requête puisse me donner 

    customer_email          différence_en_jours

    xx@gmail.com            3

    yy@gmail.com            6

    Auriez-vous une idée de la manière de procéder ?

    Merci beaucoup !

    • Partager sur Facebook
    • Partager sur Twitter
      8 août 2018 à 17:29:46

      Bonjour,

      Déjà tu ne devrais pas avoir X fois les e-mails mais une clé étrangère qui fasse la liaison avec une table "users"

      Ensuite, le plus simple serait de faire une première requête LIMIT 0,1 et une deuxième LIMIT 1,1 avec un classement pare date DESC.

      Et donc de faire la différence.

      Par contre, ta colonne created_at n'a pas l'air d'être en DATETIME comme ça.

      -
      Edité par philodick 8 août 2018 à 17:30:27

      • Partager sur Facebook
      • Partager sur Twitter
        8 août 2018 à 19:24:07

        Salut P.

        Merci beaucoup pour ta réponse rapide!

        Effectivement, la colonne n'a pas l'air d'être en DATETIME, mais c'est bien le cas sur la vraie table. J'aurais du rajouter la partie TIME dans l'exemple.

        Ok j'avais effectivement pensé à passer par DESC et LIMIT mais j'avais du mal à comprendre comment cela pourrait fonctionner. 

        Est-ce qu'il serait possible par exemple de créer une table dans la requête en générant automatiquement des ID ? Je pense à CREATE TABLE puis AUTO_INCREMENT mais je ne sais pas si c'est possible.

        Pour l'instant ma requête ressemble à cela (sachant que la partie en rouge est la partie qui pose problème): 

        SELECT customer_email, last_order, count, penultimate_order

        FROM

        (

        SELECT customer_email, MAX(created_at) AS "last_order", COUNT(DISTINCT(increment_id)) AS "count" ,(

          SELECT MAX(created_at) FROM sales_order WHERE created_at < (SELECT Max(created_at) FROM sales_order)) AS "penultimate_order"

        FROM sales_order

        WHERE created_at >= '2018-06-19' 

        GROUP BY customer_email

         )x

        WHERE count > 1

        Et le problème est que dans la colonne penultimate_order, elle me retourne toujours la même valeur... Et j'avoue avoir un peu de mal à comprendre comment m'en sortir (j'ai commencé SQL il y a moins d'une semaine). 

        Merci beaucoup pour vos réponses et excellente soirée !

        • Partager sur Facebook
        • Partager sur Twitter
          9 août 2018 à 12:40:18

          C'est normal qu'elle te donne la même valeur, parce que ton MAX(created_at) ne tient pas compte du client. Mais là je n'ai pas de solution comme ça pour tout afficher en groupant par client...

          • Partager sur Facebook
          • Partager sur Twitter
            27 août 2018 à 13:28:22

            Bonjour,

            TdB___ a écrit:

            pour chaque client (customer_email), de connaître l'écart en jours entre la dernière et avant_dernière commande

            Une idée est de calculer d'abord la dernière commande par client dans une sous-requête, puis de faire une jointure pour trouver la précédente :

            SELECT
            	LO.customer_email,
            	LO.nb_order,
            	LO.last_order,
            	MAX( PO.created_at ) AS penultimate_order
            FROM
            	(
            		-- Dernière date de commande par client
            		-- Pour les clients ayant plus d'une commande
            		SELECT
            			customer_email,
            			COUNT(*) AS nb_order,
            			MAX(created_at) AS last_order
            		FROM sales_order
            		GROUP BY customer_email
            		HAVING COUNT(*) > 1
            	) LO
            		INNER JOIN sales_order PO
            			ON LO.customer_email = PO.customer_email
            			AND PO.created_at < LO.created_at
            GROUP BY
            	LO.customer_email,
            	LO.nb_order,
            	LO.last_order
            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              30 août 2018 à 14:12:35

              Super merci beaucoup Benzouye !
              • Partager sur Facebook
              • Partager sur Twitter

              SQL Calculer l'écart en jours entre 2 commandes

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown