2010-04-07 42 views
1

好吧,这里的交易我得到了一堆客户信息的表。 每个客户每年最多一次购买一次,这是由一行代表。 有一年的专栏,并且有一列包含每个客户的唯一标识符。我需要做的是构建去年和今年的查询,并向我展示哪些客户去年在这里进行了购买,但未在今年进行购买。比较mysql表上的行

我还需要建立一个查询,告诉我哪些客户去年和去年没有进行购买,但今年确实进行了购买。

+2

你可以添加一些示例数据? – 2010-04-07 19:37:50

回答

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子句的右边使用常量。 – 2010-04-07 20:00:17

+0

@Marcus:我没有使用常量,所以你只需要在一个地方改变'Year'来在不同的年份使用它。他们可以通过这种方式更容易地转化为观点。 – RedFilter 2010-04-07 20:01:33

+0

这是一个很好的理由。查询是否可以在Year上使用ON子句右侧表达式上的索引? – 2010-04-07 20:22:32