2

我正在尝试编写一个 SQL 查询(用于 SQL Server)来搜索表中满足某些不涉及聚合功能但仍需要 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

任何帮助将不胜感激。

谢谢大家!

4

1 回答 1

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

与您的结果的一个不同之处在于,这将为“Jason”返回 bookid =2,但这似乎与您的描述一致。

于 2013-04-24T20:36:53.023 回答