안녕하세요
아주 간만에 질문 하나 드립니다.
시험문제가 있고 학생들이 답을 합니다.
문제는 총 3개 이며, 각각에 대한 문항수는 5 개 입니다.
답변 테이블에 이런식으로 저장이 됩니다.
q
--------
{1,1,3}
{2,2,2}
{1,4,2}
...
q 는 배열요소 순서는 문제번호 순서이고
해당 레코드들은 각 번호에 대한 기입한 답입니다.
즉, 첫번째 레코드는 문제1번에 답을 1 2번도 1 3번은 3 을 답한 경우입니다.
그 데이타를 이용하여 출력할 내용은 각 문제들에 대하여
1번을 답한거 몇개, 2번을 답한거 몇개...... 5번을 답한거 몇개.. 를 내는 것입니다.
즉..
no s1 s2 s3 s4 s5
------------------
1 2 1 0 0 0
2 1 1 0 1 0
3 0 2 1 0 0
이런식이 되겠죠..
(no: 문제번호, s1 ~s5: 문항)
이것을 풀기 위해 유니온을 사용하였씁니다.
select no,s1,s2,s3,s4,s5 from
(
(select 1 as no,
sum(case q[1] when 1 then 1 else 0 end) as s1,
sum(case q[1] when 2 then 1 else 0 end) as s2,
sum(case q[1] when 3 then 1 else 0 end) as s3,
sum(case q[1] when 4 then 1 else 0 end) as s4,
sum(case q[1] when 5 then 1 else 0 end) as s5
from ans where q[1] is not null
)
union all
(select 2 as no,
sum(case q[2] when 1 then 1 else 0 end) as s1,
sum(case q[2] when 2 then 1 else 0 end) as s2,
sum(case q[2] when 3 then 1 else 0 end) as s3,
sum(case q[2] when 4 then 1 else 0 end) as s4,
sum(case q[2] when 5 then 1 else 0 end) as s5
from ans where q[2] is not null
)
union all
(select 3 as no,
sum(case q[3] when 1 then 1 else 0 end) as s1,
sum(case q[3] when 2 then 1 else 0 end) as s2,
sum(case q[3] when 3 then 1 else 0 end) as s3,
sum(case q[3] when 4 then 1 else 0 end) as s4,
sum(case q[3] when 5 then 1 else 0 end) as s5
from ans where q[3] is not null
)
) t
order by no
이렇게 하면 답은 나옵니다만..
문제가 3개에 거치지 않고, 10개, 20 개 25개 정도로 늘어나면
데이타는 아주 간단하게 저장되지만.. 쿼리가 엄청나게 길어집니다.
사실 문제갯수만큼 번호(순서) 만 바뀔 뿐 똑같은게 반복되니깐
그래서 generate_series(1,3) 을 이용하여 이래저래 해보는데..
이상하게 조인조건이 없어서인지.. cross join 된 결과가 나와버려서..
여엉 엉뚱한 답이 나옵니다.
generate_series() 를 이용하면 될것도 같은데..
잘 안 되네요...
힌트나 도움 좀 부탁합니다.
postgresql 에서도 오라클의 decode () 를 지원해 줬음 좋겠습니다.
(어떻게 안 될려나요?..)
|