我是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
我试图找到在食物和社交上花钱的学生,但在社交上花的钱多于食物。
我试过了:
Select name
from student
where item = 'social' and item = 'food'
答案 0 :(得分:7)
没有单独的数据行item = 'social'
和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
这为所有<{1}} 记录的所有学生提供了'social'
。
然后,您可以添加以下内容,以便仅获得在'food'
上花费的费用高于'social'
的费用。
'food'
答案 1 :(得分:3)
where item = 'social' and item = 'food'
不起作用,因为单行永远不能同时存在。比较同一个表中的两行时,最简单的方法是进行自联接
SELECT
s1.Name
FROM student s1
INNER JOIN student s2
ON s1.id = s2.id
WHERE
s1.item = 'social' and s2.item = 'food'
and
s1.expenditure > s2.expenditure
注意:
如果您有相同类型支出的多行,则需要使用Dem's approach对不同类型进行求和,然后进行比较
如果你想包括那些没有在食物上花钱的人,你将不得不使用LEFT JOIN。您还要将'food'的测试移动到ON子句中,否则它将像内部联接一样。
LEFT JOIN student s2
ON s1.id = s2.id
and s2.item = 'food'