2017-09-19 3 views
1

나는 매년 전체 국가 국가 상태 및 평균 온도를 얻을이 SQL 쿼리가의 차이 각 주와 국가.는 SQL 두 개의 쿼리

국립 데이터

Year AverageTemp 
----------------- 
1954 17.5 
1955 18 

상태 데이터 : 예를 들어, 그래서

Year AverageTemp 
----------------- 
1954 15.5 
1955 15 

은 얻을 것이다 :

차이

 Year Diff 
    ----------- 
    1954 2 
    1955 3 

나는 이런 식으로 시도했지만 올바른 답을 얻지 못했습니다. 여기에 작동 할 수

SELECT 
    s.date, (c.averageTemperature - s.averageTemperature) AS Difference 
FROM 
    state s 
INNER JOIN 
    country c ON s.date = c.date 
WHERE 
    s.country = 'Africa' AND c.country = 'Africa' 

답변

3

한 가지 방법은 하위 쿼리로 두 개의 쿼리를 넣고 년에 그들과 합류하는 것입니다 :

SELECT 
    t1.valYear, 
    t1.avgTemp - t2.avgTemp AS Diff 
FROM 
(
    SELECT 
     strftime('%Y', date) AS valYear, 
     AVG(averageTemperature) AS avgTemp 
    FROM country 
    WHERE country = 'Africa' 
    GROUP BY valYear 
) t1 
INNER JOIN 
(
    SELECT 
     strftime('%Y', date) AS valYear, 
     AVG(averageTemperature) AS avgTemp 
    FROM state 
    WHERE country = 'Africa' 
    GROUP BY valYear 
) t2 
    ON t1.valYear = t2.valYear 

위의 쿼리는 그것에 느낌 해킹의 비트를 가지고있다. 하나의 테이블에 나타나지만 다른 테이블에는 나타나지 않는 한 해의 사건을 다루기 위해 전체 외부 조인 또는 추한 조합 쿼리에 의존해야합니다. 그리고 어쨌든 우리는 완전히 없어 졌던 해를 커버하기 위해 달력 표를 사용해야 할 수도 있습니다. 더 나은 데이터 모델은 모든 데이터를 월 단위로 단일 테이블에 저장하는 것입니다. 그런 다음, 연중 평균은 주어진 해의 모든 달에 걸쳐 합산함으로써 얻을 수 있습니다.

1
SELECT s.valYear, (c.average - s.average) AS Difference 
FROM (SELECT EXTRACT(YEAR FROM date) AS valYear, AVG(averageTemperature) AS average 
     FROM state WHERE country = 'Africa' GROUP BY valYear 
    ) AS s, 
    (SELECT EXTRACT(YEAR FROM date) AS valYear, AVG(averageTemperature) AS average 
     FROM country WHERE country = 'Africa' GROUP BY valYear 
    ) AS c 
WHERE s.valYear = c.valYear