【问题标题】:SQL query on conditional expressions条件表达式的 SQL 查询
【发布时间】:2020-05-03 20:42:08
【问题描述】:

我正在开始一个 SQL 速成课程,但我遇到了这个问题,它困扰着我,我找不到解决方案,而且由于锁定,我没有人可以问。这是关于条件表达式的。在这个问题中,有些人演奏不同的乐器,他们偶尔在学校演奏二重奏。如果他们演奏该乐器,我需要找到一个查询来检索带有名称和吉他(是或否)的表。我必须使用以下表格: 表学生

|  id | name        |  grade  | gender
+-----+-------------+---------+------
|  1  | John        |    12   |  M
|  2  | Andrew      |    11   |  F
|  3  | Abigail     |    11   |  F
|  4  | Simon       |    10   |  M

二重唱

| id | idStudent1 | idStudent2 | duetOf
+----+------------+------------+------
| 20 |    1       |    2       | Piano
| 35 |    2       |    4       | Piano
| 36 |    3       |    2       | Drums
| 37 |    4       |    1       | Drums
| 35 |    4       |    2       | Guitar
| 36 |    4       |    2       | Flute
| 37 |    4       |    3       | Piano

查询:

select s.name, Coalesce (d.duets, '(none)')
from students s, duet d
where s.id = d.idStudent1
  and s.id = d.idStudeant2
  and d.instrument = 'guitar'

关于如何解决此类问题的任何提示?

【问题讨论】:

  • 不清楚你想要什么。很高兴您有输入表,但是您期望作为输出的示例可以提供正确的答案。
  • 二重奏都是同一种乐器?
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它

标签: sql join group-by pivot


【解决方案1】:

你可以做条件聚合:

select
    s.id,
    s.name,
    max(case when d.duetOf = 'Piano'  then 'Yes' else 'No' end) piano,
    max(case when d.duetOf = 'Guitar' then 'Yes' else 'No' end) guitar
from students s
left join duets d 
    on s.id in (d.idStudent1, d.idStudent2)
group by s.id, s.name

这会为students 中的每条记录生成一条记录,其中有两列指示学生是否属于弹吉他或钢琴的二重奏。

如果您需要显示students 表中的更多列,可以在selectgroup by 子句中添加它们。

【讨论】:

  • 谢谢,这是一个非常聪明的方法,并且运行顺利。你让这看起来真的很容易。紧张了一段时间。谢谢@GMB!感谢您的意见。我会修改更多这些问题
  • 欢迎@DashSysre。如果我的回答正确回答了您的问题,那么请点击复选标志accept it...谢谢。
【解决方案2】:

检查一下

select s.name, case when duetOf = 'Guitar' then 'Yes' Else 'No' End as Guitar  
from duet d
inner join students s on d.idStudent1 = s.Id or d.idStudent2 = s.Id

【讨论】:

    猜你喜欢
    • 2016-10-17
    • 2016-11-09
    • 1970-01-01
    • 2013-05-10
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2015-12-20
    相关资源
    最近更新 更多