2010-04-07 39 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