2016-06-05 1 views
0

에 이전의 MySQL의 스크립트를 변환 : 내가 선생님을 포함하는 새로운 요약 테이블을 (선생님)을 생성 평균, 년을 득점 할처럼 내가 반복 예를 들어, 데이터 (결과 테이블)이 포스트 그레스 9.5

year,teacher, score, class, state 
2016, Jones, 80, math 102, NC 
2016, Smith, 66, history, KY 
2016, Jones, 40, math 101, SC 
2014, Jones, 60, science, AK 

하고, 교사의 지시 클래스 :

SELECT 
    teacher, class, 
    AVG(case when class rlike 'match' THEN score END) tlevel_avg, 
GROUP_CONCAT(DISTINCT(state) order by state SEPARATOR ' ') 
FROM results 
group by teacher 
order by tlevel_avg desc 
where year like '2012' 

그것은 전자 :

teacher, average, class, state 
Jones, 60, 2016, math, NC SC 

내 원래 (이상) MySQL의 스크립트와 유사한 모습 xported to file.

내가 포스트 그레스와 같은 결과를 얻을을 시도했지만

(I 어디 교사 값없이 평균에 대한 선택을 생성하기 때문에 presumabley) 나는 각각 동일한 데이터를 가진 유일한 교사를 얻을 나는 어떻게 확실하지 않다 특정 교사와 관련된 평균이되도록이 쿼리를 구성합니다.

SELECT distinct teacher, 
(select AVG(CASE when results.class SIMILAR TO '%math%' THEN results.score END) as training_level_avg from results) 
(select AVG(CASE when results.class SIMILAR TO '%science%' THEN results.score END) as training_level_avg from results) 
FROM RESULTS 
WHERE teacher NOT LIKE '%temporary%' 
AND results.year = '2011' 
GROUP by results.teacher 

은 주로 내가 일년에 주어진 교사에 의해 그룹화 클래스의 모든 occurance에 대한 제대로 계산 된 평균으로 반환 된 데이터를 얻기 위해 노력하고 있어요,하지만 난 또 다른 '교사'테이블에이 결과를 작성해야합니다 (보너스 질문).

같이하고 싶은 내 고비에 걸쳐 대단히 감사합니다

+2

'group_concat()'을'string_agg()'로 대체하고 원하는 것을 줄 수있는'class by teacher, class'를 사용한다면. –

답변

0

귀하의 질의를 받고 어떤 도움 : 구문이 약간 다르지만

SELECT teacher, class, 
     AVG(case when class = 'match' THEN score END) as tlevel_avg, 
     STRING_AGG(DISTINCT state ORDER BY state, ' ') as states 
FROM results 
where year = '2012' 
GROUP BY judge 
ORDER BY tlevel_avg DESC; 

string_agg()group_concat()의 것과 동일합니다.

대/소문자를 처리하는 방법에 차이가 있는지 기억하지 않습니다. 대소 문자가 문제가 될 수있는 경우 = 'match'을 ilike 'match'로 바꿀 수 있습니다.

+0

'ERROR : function string_agg (character varying)이 존재하지 않습니다. LINE 3 : STRING_AGG (DISTINCT 상태 ORDER BY 상태, '')를 ...로 설정하십시오. ^ 힌트 : 집계 함수가 일치하지 않습니다. 주어진 이름과 인수 유형. 아마도 ORDER BY를 잘못 배치했을 것입니다. ORDER BY는 집계의 모든 정규 인수 뒤에 나타나야합니다. ' –

+0

고든에게 감사드립니다.이 변화는 작동합니다.'AVG (클래스 ilike '% training %'THEN 점수 END)를 tlevel_avg, STRING_AGG (DISTINCT 상태, 'ORDER BY 상태') –