sql - 在 SQL 中使用 group by 子句过滤行

标签 sql sql-server group-by

我正在尝试编写一个 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/

相关文章:

sql - Azure sql 数据同步代理 2 无法安装

SQL JOIN AND OR 条件

Python创建额外的文件夹

mysql - 使用 SUM 进行分组

SQL查询非重复记录

sql - 在 SQL 中使用时区

sql-server - T-SQL 获取所有唯一组及其使用计数

sql - 使用 windows 函数减去两列

mysql通过拥有计数组

php - 从特定数字开始更改表中所有行的 id 值