sql基本查询

时间:2012-11-19 15:45:46

标签: 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

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

我试过了:

Select name
from student
where  item = 'social' and item = 'food' 

2 个答案:

答案 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

注意:

  1. 如果您有相同类型支出的多行,则需要使用Dem's approach对不同类型进行求和,然后进行比较

  2. 如果你想包括那些没有在食物上花钱的人,你将不得不使用LEFT JOIN。您还要将'food'的测试移动到ON子句中,否则它将像内部联接一样。

     LEFT JOIN student s2
      ON s1.id = s2.id
        and s2.item = 'food'   
    
  3. SQL Fiddle Demo