Свести ответ на запрос SQL - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь получить плоскую таблицу для вопросов и ответов с помощью mysql. Это мои таблицы.

PollQuestion

PollID | Question| A | B | C | D | E | TimeStamp

PollReponse

PollReponseID | PollID | UserID | Answer

В таблице PollAnswer я получаю Пять ответов как VARCHAR A, B, C, D, E.

Я написал запрос, чтобы сгруппировать ответы по A, B, C, D, E.

    select q.Question
     , q.PollID
     , r.Answer
     , count(r.Answer) 
  from pollQuestions q
     , pollResponse r
 where  q.PollID = r.PollID 
 group 
    by r.Answer
     , q.Question
     , q.PollID 
 order 
    by r.PollID;

Что дает мне ответ следующим образом.

Question | PollID | Answer | count
alpha    |  1     | A     | 2 
alpha    |  1     | B     | 3 
alpha    |  1     | C     | 4 
alpha    |  1     | D     | 0
alpha    |  1     | E     | 0 
betas    |  2     | A     | 3 
betas    |  2     | B     | 4 
betas    |  2     | C     | 4 
betas    |  2     | D     | 6
betas    |  2     | E     | 0 

Я хочу сгладить ответ следующим образом.

Question | PollID | countA | countB | countC | countD | countE
alpha    |  1     | 2      | 2      |  4     |  0     |   0 
betas    |  2     | 3      | 4      |  4     |  6     |   0 

Могу ли я в любом случае добиться этого без изменения структуры таблицы?

Любой указатель будет оценен.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Вы можете использовать group by с sum(case when...), как показано ниже:

select pq.Question, pq.PollID,
       sum(case when pr.Answer = 'A' then 1 else 0 end) as 'countA',
       sum(case when pr.Answer = 'B' then 1 else 0 end) as 'countB',
       sum(case when pr.Answer = 'C' then 1 else 0 end) as 'countC',
       sum(case when pr.Answer = 'D' then 1 else 0 end) as 'countD',
       sum(case when pr.Answer = 'E' then 1 else 0 end) as 'countE'
from PollQuestion pq
left join PollResponse pr on pq.PollID = pr.PollID
group by pq.Question, pq.PollID
0 голосов
/ 11 ноября 2018

Вы можете попробовать использовать агрегатную функцию условия.

select 
    pollQuestions.Question, 
    pollQuestions.PollID, 
    count(CASE WHEN pollResponse.Answer ='A' THEN 1 END) countA,
    count(CASE WHEN pollResponse.Answer ='B' THEN 1 END) countB,
    count(CASE WHEN pollResponse.Answer ='C' THEN 1 END) countC,
    count(CASE WHEN pollResponse.Answer ='D' THEN 1 END) countD,
    count(CASE WHEN pollResponse.Answer ='E' THEN 1 END) countE
from pollQuestions 
JOIN pollResponse on pollQuestions.PollID = pollResponse.PollID  
group by 
    pollQuestions.Question,
    pollQuestions.PollID  
order by  
    pollResponse.PollID;

ПРИМЕЧАНИЕ

Я бы использовал JOIN вместо запятой ,, потому что JOINСинтаксис яснее, чем , о соединении двух таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...