2015-01-08 68 views
2

如果你研究這個表,你會看到戴夫是獨一無二的,因爲他贏得了multiple awards in a single year,他已經完成這for multiple years如何查詢計數內的計數(不使用子查詢)?

 
person award year 
------------------------------- 
Dave red  2015 
Dave blue 2015 
Dave red  2013 
Dave green 2013 
Susan blue 2015 
Susan green 2011 
Susan red  2011 
Susan red  2010 
Tom  red  2012 
Tom  blue 2012 
Tom  green 2012 
Tom  yellow 2012 
Tom  purple 2012 

有沒有辦法不使用子查詢查詢戴夫(對於超過1年多獎獲得者)?
例如,你可以說GROUP BY person HAVING COUNT(DISTINCT year) > 1 AND COUNT(*) > 3但這也會產生蘇珊。

+0

爲什麼你對使用子查詢有限制? –

+1

當我發佈這個問題後,我意識到子查詢將會很好。但問題仍然存在?有沒有簡單的方法來實現這一點?我在想... – prograhammer

+0

@DavidGraham - 你應該編輯你的問題,不限制子查詢...我發佈了一個解決方案使用 - 不知道沒有可能。 – sgeddes

回答

3

我認爲你可以這樣做:

select a1.person 
    from awards a1 
    join awards a2 
    on a1.person = a2.person 
    and a1.year = a2.year 
    and a1.award <> a2.award 
group by a1.person 
having count(distinct a1.year) > 1 

小提琴: http://sqlfiddle.com/#!2/b98bf/8/0

但是,你將與一個子查詢更好:

select person 
    from (select person, year, count(*) as num_in_yr 
      from awards 
     group by person, year) x 
group by person 
having sum(num_in_yr >= 2) >= 2 

小提琴: http://sqlfiddle.com/#!2/b98bf/7/0

+0

啊,我看到你在這裏做了什麼...使用額外的'JOIN',以便每個人 - 年必須有一個「對」(然後'清楚的複製年份)並計數。聰明!正如你所提到的,我應該堅持一個子查詢(我一直使用這個子查詢,但現在我確認沒有太多不同的解決方案)。謝謝! – prograhammer

+0

絕對是一個非常聰明的解決方案。 –