sql基本查询

use*_*066 3 sql

我是sql的新手,并且玩了一些我发现的示例数据库.我有一张叫做学生的桌子如下

id    name    expenditure      item
 1     dan      45              social
 1     dan      60              books
 2     sarah    32              food
 3     matt     64              food
 3     matt     71              social
Run Code Online (Sandbox Code Playgroud)

我试图找到在食物和社交上花钱的学生,但在社交上花的钱多于食物.

我试过了:

Select name
from student
where  item = 'social' and item = 'food' 
Run Code Online (Sandbox Code Playgroud)

Mat*_*lie 7

没有单独的数据行具有item = 'social'AND item = 'food'.由于该WHERE条款一次适用于一行数据,因此您无法做到这一点.

您需要做的是按学生将所有记录组合在一起,然后检查该组中数据的某些特征.

SELECT
  id,
  name
FROM
  student
GROUP BY
  id,
  name
HAVING
      SUM(CASE WHEN item = 'social' THEN 1 ELSE 0 END) > 0
  AND SUM(CASE WHEN item = 'food'   THEN 1 ELSE 0 END) > 0
Run Code Online (Sandbox Code Playgroud)

这给了谁拥有所有学生一些用于记录'social'一些记录'food'.

然后,您可以添加以下内容以仅获得花费更多'social'而非花费更多的人'food'.

AND SUM(CASE WHEN item = 'social' THEN expenditure ELSE 0 END)
    >
    SUM(CASE WHEN item = 'food'   THEN expenditure ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)