2012-12-01 7 views
0

Je dois créer une requête MySQL pour un rapport.MySQL Reporting - Historique des commandes

J'ai une table history qui conserve l'enregistrement des changements d'état de l'ordre d'un produit. J'ai ces statuts pour le cycle de vie d'une commande (le flux d'une commande): nouveau, confirmé, traitement, expédié, livré, annulé, retourné. Une commande ne suit pas nécessairement ce flux d'état, par exemple: Une nouvelle commande peut être annulée immédiatement, ou elle peut être annulée pendant le traitement. Cela rend les rapports précis plus complexes.

Maintenant, je veux faire un rapport de chaîne d'approvisionnement des commandes qui ont été confirmées, traitées, expédiées, puis livrés. Mais ce rapport devrait exclure les commandes qui ont été annulées à tout moment ou retournées.

Considérons cet exemple:

Un ordre (id: 34) a été placé par un client. Statut initial: Nouveau. Confirmé par un agent, statut défini sur Confirmé. Le gestionnaire de la chaîne d'approvisionnement vérifie la disponibilité, les changements de statut au traitement, puis expédie et puis livré.

Un autre ordre (id: 55) vient, Nouveau, confirmé, traitement mais annulé. history ressemble:

id order_id status 
111 34  new 
112 34  confirmed 
113 55  new 
114 55  confirmed 
115 55  processing 
116 34  processing 
117 55  cancelled 
118 34  shipped 
119 34  delivered 

Comment puis-je faire une requête de rapport pour obtenir uniquement les commandes qui ont été

  1. Confirmé, transformés, expédiées et livrées.
  2. Confirmé, traité, annulé.
  3. a confirmé, annulé
  4. et ainsi de suite ...

Comment puis-je écrire une requête pour obtenir ce genre de rapports?

Répondre

1

pour nouvel ordre: select distinct (order_id) de l'histoire où le statut = new pour le nouveau traité: select distinct (order_id) de l'histoire où le statut = traité et ainsi de suite

pour ceux pour qui sont nouveaux, traité et livré

sélectionnez t1.order_id de l'historique comme t1, l'historique comme t2, l'historique comme t3 où t1.order_id = t2.order_id et t2.order_id = t3.order_id et t1.status = new et t2.status = traité et t3.status = livré

comme ceci continue pour les autres

+0

C'est génial. Et si je mets aussi du temps dans la clause "WHERE". Comme 't3.date_added> t2.date_added et t2.date_added> t1.date_added'. En d'autres termes, un ordre était tout d'abord nouveau, puis défini sur processus, puis sur livré. De cette façon, je serai capable de trier le flux d'état aussi bien ... Pas vrai? –

+0

yahh vous pouvez le faire. et si la réponse est utile, n'oubliez pas de l'accepter. Merci. –