2009-09-30 10 views
0

J'essaie de faire quelque chose dans une requête que je n'ai jamais faite auparavant. cela nécessite probablement des variables, mais je ne l'ai jamais fait, et je ne suis pas sûr que ce soit le cas.Question de requête SQL

Ce que je veux, c'est obtenir une liste des ventes, groupées d'abord par affilié, puis par mois.

Je peux le faire, mais voici le twist ... Je ne veux pas le mois, mais le mois 1, 2 mois, 3 mois ...

Et ce ne sont pas janvier, février, mars , mais le nombre de mois écoulés depuis le premier jour de la vente.

Est-ce possible dans une requête ou dois-je le faire dans mon code?

Oh, mysql 5.1.something ...

+0

Pouvez-vous donner un exemple? – BobbyShaftoe

Répondre

1

Bien sûr, il suffit d'écrire une expression dans SQL qui génère le nombre de mois écoulés depuis la première vente (Voulez-vous dire la première vente pour ce AFILIATE? Si oui, vous des ventes, je suppose que vous ne voulez pas vraiment "Grouper" affilaite et monthcount, vous voulez juste Trier, ou Trier par ces valeurs

Si vous voulez le montant des ventes moyennes, ou le nombre de ventes, ou un autre Agréger fonction des données de vente, alors vous feriez un "Group By" ...

Et je ne pense pas que vous devez vous soucier de trier par le nombre de mois, vous pouvez simplement trier par la différence entre chaque date de vente et la date de vente la plus récente pour chaque affilié. (Si vous voulez appliquer une troisième règle de tri, après le tri de la date de vente, alors vous devez être plus prudent.)

Select * From Sales S 
    Order By Affiliate, 
     SalesDate - (Select Min(SalesDate) 
         From Sales 
         Where Affiliate = S.Affiliate) 

Ou, si vous avez vraiment besoin d'être par la différence dans les mois

Select * From Sales S 
    Order By Affiliate, 
     Month(SalesDate) - 
       (Select Month(Min(SalesDate)) 
       From Sales 
       Where Affiliate = S.Affiliate) 
+0

@Charles Vous avez oublié le GROUP BY et aussi le fait que le regroupement doit se faire par mois (nécessitant DateDiff()). mais oui !, cela semble être tout ce dont le PO a besoin. – mjv

0

Ceci est possible en SQL standard si vous utilisez ce que j'appelle "SQL gymnastique". Cela peut être fait avec des sous-requêtes.

Mais il semble incroyablement moche, est difficile à entretenir et ça ne vaut vraiment pas le coup. Il vaut mieux utiliser l'un des nombreux langages de programmation qui enveloppent SQL (comme PL/SQL) ou même un langage généraliste qui peut appeler SQL (comme Python).

Le résultat sera dans deux langues mais sera d'autant plus compréhensible que la même chose écrite en SQL seulement.

+0

Cependant, le SQL pur est souvent étonnamment rapide, car il peut être optimisé et parallélisé. –