2012-11-19 5 views
3

Im 새로운 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

그것에 대해 생각 : 어떻게 ** 한 ** 열이 동시에 값 ''social'' *와 * ''food'' **을 가질 수 있습니다 ** ? –

답변

7

없음 개별 라인은 item = 'social'item = 'food'이 없습니다. WHERE 절은 한 번에 한 행의 데이터에 적용되므로 그렇게 할 수 없습니다.

학생이 모든 기록을 그룹화 한 다음 해당 그룹의 데이터 특성을 확인하십시오. 'food'에 대한 'social'일부 기록을 위해 일부 기록이있는 모든 학생을 제공

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'에 추가 할 수 있습니다.

AND SUM(CASE WHEN item = 'social' THEN expenditure ELSE 0 END) 
    > 
    SUM(CASE WHEN item = 'food' THEN expenditure ELSE 0 END) 
+0

+1 ... 당신은 2 초 정도 나를 이겼습니다. – ppeterka

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' 
    

SQL Fiddle Demo