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):
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, 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 !
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...
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
× 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.
N'oubliez pas d'activer les erreurs PDO.
N'oubliez pas d'activer les erreurs PDO.