Minha pergunta morreu depois de uma resposta inútil no SO aqui
Eu preciso que isso seja otimizado porque será chamado com frequência. Ele está entrando em um procedimento armazenado.
I am given @slide (tblILDSlide.id) and @sessionid (tblILDSession.id)
Eu preciso que meus resultados fiquem assim:
--lets say students had answered a(3),b(10),c(0),d(5) in a survey (test)
|Answer Counts
0|3
1|10
2|0 --this needs to show as a zero and not be skipped
3|5
Como cada pergunta terá um número diferente de respostas possíveis, preciso ter as linhas semeadas do @@rowcount of Choice para o QID que está aqui:
**dbo.tblSurveyAnswerChoice
QID (int, not null)
Sequence (int, null)
Choice (nvarchar(100), null) --this column will vary and is for choices
--like true/false, Yes, No, Red Blue,
--or even Completely Agree,Somewhat Agree...,Completely Disagree
Para obter o QID eu tenho que usar @slide e:
**dbo.tblILDSlide
id (PK, int, not null)
slide_type(FK, int, not null)
question_id(FK, int, null)
media_url(nvarchar(100), null)
Preciso de uma linha para cada escolha (com zeros para opções sem respostas). As respostas são mantidas aqui:
--there can be more than one response per question
--like for multiple-multiple choice (check all that apply)
**dbo.tblResponses
response_id(FK, int, not null)
answer_sequence (int, null) --accepts 1,2,3 etc for choice
other (nvarchar(50), null) --for text answers
Para obtê-los, tenho que usar response_id, que posso obter usando @sessionid E @slide aqui:
**dbo.tblSlideResponseInfo
id (PK, int, not null)
user_id(nvarchar(50), not null)
slide_id (FK, int, not null)
response_date (datetime, not null)
session_id (FK, int, not null)
Copiado da postagem no stackoverflow: Meu problema é que quando há uma escolha possível sem respostas, não consigo contar. Portanto, sei que preciso pegar as opções possíveis que estão disponíveis [na outra tabela ...] Estou pensando em retornar uma linha em branco para cada resposta que existe no tblSurveyAnswerChoices e, de alguma forma, juntar as outras contagens a isso, mas Eu não consigo entender.
(copiando minha própria resposta da mesma pergunta no StackOverflow)
Sua postagem já inclui uma boa resposta: "Estou pensando que preciso retornar uma linha em branco para cada resposta que existe no tblSurveyAnswerChoices e, de alguma forma, juntar as outras contagens a isso."
Aqui está uma maneira de fazer isso:
O uso de
left join
garante que qualquer escolha na primeira tabela seja listada. Por padrão, a junção esquerda retornaria NULL para itens não existentes na segunda tabela, masifnull
permite substituir NULL por 0.NOTA:
ifnull
no MySQL deve ser substituído porisnull
no TSQL