我正在尝试编写一个 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
任何帮助将不胜感激。
先谢谢大家了!
最佳答案
如果您想查找借阅这些书籍组合之一的所有学生,我建议使用聚合:
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,但这似乎与您的描述一致。
关于sql - 在 SQL 中使用 group by 子句过滤行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16201615/