2010-12-11 3 views
1

Je dois écrire une requête où pour chaque client et chaque mois de 2009, calculer l'achat moyen avant chaque mois, après chaque mois, et montre une liste avec les clients et les mois, où l'achat moyen après chaque mois est supérieur à l'achat moyen avant le mois.Aide à la construction d'une requête pour calvuler avg(), avant un mois, et après un mois

Exemple de ce qu'il doit montrer:

name   month avgBefore avgAfter   
P.Anderson  3   13   35 

Mon problème est, alors qu'il est assez facile de créer la vue v1 qui contient (nom, code, mois, avgAmount) (une liste pour afficher le nom, avg achats pour chaque mois), je ne sais pas (ou plutôt je ne peux pas imaginer) comment faire le reste (calculer avg avant/après chaque mois).

Ex: mois avereagebefore 3 = somme (tous moyenne du mois 1 à 3), avereageAfter mois 3 = somme (tous moyenne de 3 à max (mois)

Quelqu'un peut-il s'il vous plaît me aider

? la vue V1 est comme ça (comme indiqué lorsque vous modifiez la vue dans Management studio)

SELECT  
    c.name, c.code, 
    MONTH(t.DateTime) AS minas, 
    AVG(t.charged_amount) AS total 
FROM 
    dbo.customers AS c 
INNER JOIN 
    dbo.accounts AS a ON c.code = a.customer_code 
INNER JOIN 
    dbo.creditcard AS cc ON a.acc_number = cc.acc_number 
INNER JOIN 
    dbo.transactions AS t ON cc.cc_number = t.cc_number 
INNER JOIN 
    dbo.shop AS s ON t.shop_code = s.shop_code 
WHERE 
    (YEAR(t.DateTime) = 2009) 
GROUP BY 
    c.name, c.code, MONTH(t.DateTime) 

J'ai essayé de séparer chaque mois dans une vue (comme créé 12 vues: S)

Ex:

create view [Dec](name, code, minas, averg) 
as 
    select * from v1 
    where minas = 12 

puis a fait ceci:

select 
    v1.name, v1.code, v1.minas, sum(total) 
from 
    v1, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, [Dec] 
where 
    v1.minas <= Jan.minas or v1.minas <= Feb.minas or 
    v1.minas <= Mar.minas or v1.minas <= Apr.minas or 
    v1.minas <= May.minas or v1.minas <= Jun.minas or 
    v1.minas <= Jul.minas or v1.minas <= Aug.minas or 
    v1.minas <= Sep.minas or v1.minas <= Oct.minas or 
    v1.minas <= Nov.minas or v1.minas <= [Dec].minas 
group by 
    v1.name,v1.code,v1.minas 

mais cela n'a pas fonctionné.

également pour un test que j'ai essayé:

select 
    v1.name, v1.code, v1.minas, sum(v1.total) 
from 
    v1, Jan as v2, Feb as v3 
where 
    v1.code = v2.code and v1.code = v3.code 
group by 
    v1.name, v1.code, v1.minas 

mais le résultat était

Nelson J. Arredondo 100606 1 75 
Nelson J. Arredondo 100606 2 100 
Nelson J. Arredondo 100606 5 250 

au mois 2, il aurait dû être 175 et mois 5 250 + 175

peut vous s'il vous plaît aidez-moi à comprendre cela?

+0

Je pense qu'avant de faire du SQL, vous clarifiez le plus le contexte statistique. moyenne avant le mois 3 = somme (toutes les moyennes du mois 1 à 3). 1) peut-être que vous venez de choisir un nom trompeur ici, je voudrais exclure le mois 3 et utiliser les mois 1 et 2 ici. 2) En utilisant seulement la somme des moyennes ne donne pas quelque chose de comparable, je devrais au moins diviser par 2. Et dans la pratique je voudrais juste utiliser juste le avarage dans la gamme avant. –

+0

ci-dessus était juste un exemple sur ce que la requête doit retourner. Actuallu la vue V1, a avant chaque mois et chaque client, l'achat moyen. Aussi ce que j'ai essayé de faire ci-dessus, était de faire la somme de la moyenne de chaque client pour les mois précédents. disons que Nelson J. Arredondo avait en moyenne 75 achats pour janvier et 100 en février. Puis l'achat moyen avant février était de 75 et après février de 175. De même pour le mois de mai, l'achat moyen avant mat est de 75 + 100 = 175. et après mai est 75 + 100 + 250 = 375 – George

Répondre

0

Évaluez les moyennes pour chaque utilisateur dans une rangée et utilisez UNPIVOT (requiert SQL-Server 2005 ou version ultérieure) pour le transformer dans le format souhaité avec une ligne par mois et par utilisateur.

Questions connexes