3

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

2 に答える 2

7

データの個々の行にitem = 'social'ANDはありませんitem = 'food'。このWHERE句は一度に1行のデータに適用されるため、それを行うことはできません。

あなたがする必要があるのは、学生ごとにすべてのレコードをグループ化し、次にそのグループのデータのいくつかの特性をチェックすることです。

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'  1つの行が両方になることはないため、機能しません。同じテーブルの2つの行を比較する場合、最も簡単な方法は自己結合を行うことです。

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. 食べ物にお金をかけたことがない人を含めたい場合は、LEFTJOINを使用する必要があります。また、「food」のテストをON句に移動します。そうしないと、内部結合のように機能します。

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

SQLフィドルデモ

于 2012-11-19T15:49:30.347 に答える