2010-04-07 2 views
1

Хорошо, вот сделка. У меня есть одна таблица с кучей клиентской информации. Каждый клиент составляет до одной покупки в год, которая представлена ​​отдельной строкой. есть столбец за год, и есть столбец, который содержит уникальный идентификатор для каждого клиента. Что мне нужно сделать, так это построить запрос, который занимает в прошлом году и в этом году, и показывает мне, какие клиенты здесь совершили покупку в прошлом году, но не совершили покупку в этом году.сравнение строк в таблице mysql

Мне также нужно создать запрос, который показывает мне, какие клиенты не совершали покупку в прошлом году и в прошлом году, но совершили покупку в этом году.

+2

Не могли бы вы добавить некоторые данные примера? –

ответ

4

Учитывая эту таблицу:

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

Образец данных:

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) 

Сделано покупку в 2009 году, но не в следующем году (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 

Результаты:

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

Сделано покупку в 2010 году, но не предыдущие два года (2008 и 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 

Результаты:

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

@Orbman, Отличная работа, но я думаю, что буду использовать константы в правой части вашего предложения ON в течение года. –

+0

@Marcus: Я сделал без констант, так что вам нужно только изменить «Год» в одном месте, чтобы использовать его в разные годы. Таким образом, их легче превратить в представления. – RedFilter

+0

Это хорошая причина. Может ли запрос использовать индекс в Year с выражением в правой части предложения ON? –

Смежные вопросы