2013-04-24 29 views
2

我試圖編寫一個SQL查詢(用於SQL Server)來搜索滿足某些不涉及聚合函數但仍需要group by子句的條件的所有行。通過在SQL中使用GROUP BY子句篩選行

例如,假設我們有一個表如下圖所示:

Student_Name | Borrow_Date | Book_ID 
------------------------------------  
Jason, 25-01-2012, 1 
Jason, 25-01-2012, 2 
Jason, 25-01-2012, 3 
Becky, 26-01-2012, 1 
Becky, 26-01-2012, 4 
Linda, 25-01-2012, 1 
Linda, 25-01-2012, 3 

我想找出所有從表上方是誰借與book_id 1和2書籍的學生;或在同一天(借用日期)book_id 1和3的書籍。

所以結果應該是:

Jason, 25-01-2012, 1 
Jason, 25-01-2012, 2 
Jason, 25-01-2012, 3 
Linda, 25-01-2012, 1 
Linda, 25-01-2012, 3 

任何幫助將不勝感激。

謝謝大家提前!

+0

那麼是什麼讓你覺得你需要一個group by子句? – Sebas 2013-04-24 20:35:16

+0

如果學生在同一天借用書籍1,2和3,該怎麼辦? – Lamak 2013-04-24 20:36:19

回答

2

如果你想找到是誰借的書這些組合中的一個學生,我會建議使用聚合:

select student_name, borrow_date 
from t 
group by student_name, borrow_date 
having sum(case when book_id = 1 then 1 else 0 end) > 0 and 
     (sum(case when book_id = 2 then 1 else 0 end) > 0 or 
     sum(case when book_id = 3 then 1 else 0 end) > 0 
     ) 

要想從表中的細節,你需要加入它放回:

select t.* 
from t join 
    (select student_name, borrow_date 
     from t 
     group by student_name, borrow_date 
     having sum(case when book_id = 1 then 1 else 0 end) > 0 and 
      (sum(case when book_id = 2 then 1 else 0 end) > 0 or 
       sum(case when book_id = 3 then 1 else 0 end) > 0 
      ) 
    ) tsum 
    on t.student_name = tsum.student_name and t.borrow_date = tsum.borrow_date 

與您的結果的一個區別是,這將返回bookid = 2爲「賈森」,但這似乎與您的描述一致。

+0

謝謝你的回答!第一部分非常有意義,但我認爲當您將其與原始表加入時,如果存在附加行,則不起作用 - 「Jason,25-01-2012,4」 作爲連接是根據學生姓名和借用日期 – 2013-04-24 20:50:02

+0

@AshishSachdeva。 。 。您的描述並不完全清楚在借用其他書籍時該怎麼做。如果只需要這三個bookid,則在外部查詢中添加一個where子句:'where bookid in(1,2,3)'。 – 2013-04-24 20:54:35

+0

添加where子句的作品!非常感謝。 :-) – 2013-04-24 20:58:20