2010-04-07 5 views
1

Ok voici l'affaire J'ai eu une table avec un tas d'informations client. Chaque client effectue jusqu'à un achat par an, représenté par une ligne individuelle. il y a une colonne pour l'année et il y a une colonne contenant un identifiant unique pour chaque client. Ce que je dois faire est de construire une requête qui prend l'année dernière et cette année et me montre quels clients ont été achetés l'année dernière mais ne font pas d'achat cette année.comparer des lignes sur une table mysql

J'ai également besoin de créer une requête qui me montre quels clients n'ont pas acheté l'année dernière et l'année précédente, mais ont fait un achat cette année.

+2

Pourriez-vous ajouter quelques exemples de données? –

Répondre

4

Donné ce tableau:

Purchase 
======== 
PurchaseID (autoincrement int PK) 
ClientID (int FK) 
Year (int) 
Amount (float) 

données de l'échantillon:

insert into Purchase (ClientID, Year, Amount) values (1, 2009, 123) 
insert into Purchase (ClientID, Year, Amount) values (2, 2009, 123) 
insert into Purchase (ClientID, Year, Amount) values (2, 2010, 123) 
insert into Purchase (ClientID, Year, Amount) values (3, 2010, 123) 
insert into Purchase (ClientID, Year, Amount) values (3, 2007, 123) 
insert into Purchase (ClientID, Year, Amount) values (4, 2010, 123) 
insert into Purchase (ClientID, Year, Amount) values (4, 2008, 123) 

fait un achat en 2009, mais pas l'année suivante (2010):

select p1.* 
from Purchase p1 
left outer join Purchase p2 on p1.ClientID = p2.ClientID and p1.Year = p2.Year - 1 
where p2.ClientID is null 
    and p1.Year = 2009 

Résultats:

PurchaseID Year  ClientID Amount 
----------- ----------- ----------- --------------------- 
1   2009  1   123.00 

fait un achat en 2010, mais pas les deux années précédentes (2008 ou 2009):

select p3.* 
from 
Purchase p3 
left outer join Purchase p2 on p3.ClientID = p2.ClientID and p3.Year = p2.Year + 1 
left outer join Purchase p1 on p3.ClientID = p1.ClientID and p3.Year = p1.Year + 2 
where p2.ClientID is null 
    and p1.ClientID is null 
    and p3.Year = 2010 

Résultats:

PurchaseID Year  ClientID Amount 
----------- ----------- ----------- --------------------- 
4   2010  3   123.00 
+0

@Orbman, Excellent travail, mais je pense que j'utiliserais des constantes du côté droit de vos clauses ON pour l'année. –

+0

@Marcus: Je l'ai fait sans constantes, de sorte que vous avez seulement besoin de changer le 'Year' dans un endroit pour l'utiliser pour différentes années. Ils peuvent plus facilement être transformés en vues de cette façon. – RedFilter

+0

C'est une bonne raison. La requête est-elle capable d'utiliser un index sur Year avec l'expression du côté droit de la clause ON? –

Questions connexes