3

我是 sql 新手,正在玩我找到的一些示例数据库。我有一张名为 student 的表,如下所示

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' 
4

2 回答 2

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

这给了所有有一些记录'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)
于 2012-11-19T15:48:31.457 回答
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

笔记:

  1. 如果您有多行相同类型的支出,您将需要使用Dem 的方法来对不同类型进行求和,然后进行比较

  2. 如果你想包括没有在食物上花钱的人,你必须使用 LEFT JOIN。您还将对“食物”的测试移动到 ON 子句中,否则它将像内部连接一样。

     LEFT JOIN student s2
      ON s1.id = s2.id
        and s2.item = 'food'   
    

SQL 小提琴演示

于 2012-11-19T15:49:30.347 回答