【问题标题】:Filter rows by using group by clause in SQL在 SQL 中使用 group by 子句过滤行
【发布时间】:2013-04-18 13:44:04
【问题描述】:

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

任何帮助将不胜感激。

提前谢谢大家!

【问题讨论】:

  • 那么是什么让您认为您需要 group by 子句?
  • 如果学生在同一天借书 1、2 和 3 怎么办?

标签: sql sql-server group-by


【解决方案1】:

如果您想找到所有借过这些书籍组合之一的学生,我建议使用聚合:

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,但这似乎与您的描述一致。

【讨论】:

  • 感谢您的回答!第一部分非常有意义,但我认为当您将它与原始表连接时,如果有额外的行 - “Jason, 25-01-2012, 4”,它将不起作用,因为连接是基于学生姓名的和借阅日期
  • @AshishSachdeva 。 . .你的描述不完全清楚当其他书被借用时该怎么做。如果您只需要这三个 bookid,则在外部查询中添加 where 子句:where bookid in (1, 2, 3)
猜你喜欢
  • 1970-01-01
  • 2022-09-29
  • 2019-07-13
  • 2012-11-23
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
相关资源
最近更新 更多