2012-12-15 5 views
0

저는 SQL 전문가가 아니므로 다음 경우에 대한 SQL 쿼리를 만드는 솔루션을 찾기 위해 애 쓰고 있습니다. 나는 누군가가 이것으로 나를 도울 수 있기를 바랍니다!답변을 그룹화하는 데 필요한 SQL 쿼리 솔루션

응답 테이블에 20 개의 질문 테이블의 답변이있는 몇 개의 테이블이 있습니다. 대답의 범위는 1에서 5까지입니다.

질문에 관련된 질문을 표시하는 types_id가 있습니다.

은 내가 필요한 것은 응답 테이블에 질의하고 다음과 같은 정보를 얻을 :

그룹 관련 질문 (= 같은 types_id = 같은 teamid과 = 같은 날짜) 및 답변에서 AVG을 그 types_id가 같아야합니다.

그래서 결과가 같은 것을 할 수 있습니다 : 여기에 예를 들어

--------------------------------------------------------- 
|          types_id  | 
|teamid | date    | 1 | 2 | 3 | 4 | 
--------------------------------------------------------- 
| 12 | 2012-12-31 00:00:00 | 2 | 4 | 3 | 5 | <- holds the average answers from the related questions (= same types_id) 
--------------------------------------------------------- 

을 질문 1, 5, 9, 13, 17가 types_is 1의에 의해 관련된 그래서 관련 질문 4 개 그룹이 있습니다 . 테이블 구조의 샘플 아래

:

Answers 표 :

----------------------------------------------------------------------------------------------------------------------------------------------------- 
id teamid userid date     Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 Q11 Q12 Q13 Q14 Q15 Q16 Q17 Q18 Q19 Q20 timestamp   done 
----------------------------------------------------------------------------------------------------------------------------------------------------- 
1  12  1 2012-12-31 00:00:00  1 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 2012-12-11 08:30:27 0 
2  12  2 2012-12-31 00:00:00  5 2 5 5 5 5 4 4 4 4 4 3 3 3 3 3 2 2 2 2 2012-12-11 08:50:08 0 
3  12  3 2012-12-31 00:00:00  1 3 1 1 1 1 2 2 2 2 2 4 4 4 4 4 5 5 5 5 2012-12-11 08:20:37 0 
1  9  11 2012-12-31 00:00:00  1 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 2012-12-11 08:30:27 0 
2  9  12 2012-12-31 00:00:00  5 2 5 5 5 5 4 4 4 4 4 3 3 3 3 3 2 2 2 2 2012-12-11 08:50:08 0 
3  9  23 2012-12-31 00:00:00  1 3 1 1 1 1 2 2 2 2 2 4 4 4 4 4 5 5 5 5 2012-12-11 08:20:37 0 
    ----------------------------------------------------------------------------------------------------------------------------------------------------- 

Questions 테이블

--------------------------------- 
id question   types_id 
--------------------------------- 
1 Question 1 text  1 
2 Question 2 text  2 
3 Question 3 text  3 
4 Question 4 text  4 
5 Question 5 text  1 
6 Question 6 text  2 
7 Question 7 text  3 
8 Question 8 text  4 
9 Question 9 text  1 
10 Question 10 text  2 
11 Question 11 text  3 
12 Question 12 text  4 
13 Question 13 text  1 
14 Question 14 text  2 
15 Question 15 text  3 
16 Question 16 text  4 
17 Question 17 text  1 
18 Question 18 text  2 
19 Question 19 text  3 
20 Question 10 text  4 
--------------------------------- 

어떤 도움이 크게 감사합니다!

덕분에 당신은 질문 데이터를 피벗 해제 할 필요가

+0

응답 테이블에 각 질문에 대해 20 개의 열이 아니라 20 개의 행과 question_id 열이 있으면이 방법이 더 쉬울 것입니다. – Laurence

+0

어떤 RDBMS를 사용하고 있습니까? – Taryn

+0

먼저 표를 표준화하십시오. – Kermit

답변

1

먼저 때로 믿을 수. 이 방법으로 데이터를 저장할 준비가되지 않았다면이보기를 만들 것입니다. 당신은 모든 20 질문에이를 확장해야합니다 :

Create View UnpivotedAnswers As 
Select 
    teamid, 
    date, 
    1 as QuestionID, 
    Q1 as Answer 
From 
    Answers 
Union All 
Select 
    teamid, 
    date, 
    2 as QuestionID, 
    Q2 as Answer 
From 
    Answers 
Union All 
Select 
    teamid, 
    date, 
    5 as QuestionID, 
    Q5 as Answer 
From 
    Answers 

이 형식에서 사용할 수있는 데이터가 있으면, 밖으로 평균을 얻기과 같이 수행 할 수 있습니다

Select 
    u.teamid, 
    u.date, 
    avg(case When q.types_id = 1 Then Answer End) as type1, 
    avg(case When q.types_id = 2 Then Answer End) as type2, 
    avg(case When q.types_id = 3 Then Answer End) as type3, 
    avg(case When q.types_id = 4 Then Answer End) as type4, 
    avg(case When q.types_id = 5 Then Answer End) as type5 
From 
    UnpivotedAnswers u 
    Inner Join 
    Questions q 
    On u.QuestionID = q.id 
Group By 
    u.teamid, 
    u.date 

http://sqlfiddle.com/#!2/b1b718/1

+0

대단히 감사합니다! – Aren

관련 문제