Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

maurolucio

[Resolvido] Relatório de Questionário

Recommended Posts

Saudações a todos, fiz uma pesquisa em tópicos anteriores e não encontrei algo que me ajudasse, então abro este novo tópico.

 

minha situação:

 

Tenho uma tabela onde crio vários questionários:

 

e minha tabela de respostas é esta:

 


CREATE TABLE IF NOT EXISTS `gc_resposta_questao` (
 `RQ_IdRespQuest` int(10) NOT NULL AUTO_INCREMENT,
 `RQ_IdVisitEmpreend` int(10) NOT NULL DEFAULT '0',
 `RQ_IdQuest` int(10) NOT NULL DEFAULT '0',
 `RQ_IdResp` int(10) NOT NULL DEFAULT '0',
 PRIMARY KEY (`RQ_IdRespQuest`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

Eis o questionário:

 

1 - Escolaridade

[ ] A: Primeiro Grau

[ ] B: Segundo Grau

[ ] C: Superior

[ ] D: Mestrado

 

2 - Idade

[ ] A: 15 a 20 anos

[ ] B: 20 a 25 anos

[ ] C: 25 a 30 anos

[ ] D: 35 a 40 anos

 

3 - Etc.

 

Ao fazer uma pesquisa simples buscando apenas uma resposta de uma questão tenho um resultado satisfatório:

 

SELECT COUNT(DISTINCT RQ_IdVisitEmpreend) AS Total 
FROM gc_resposta_questao
WHERE RQ_IdQuest = '1' 
AND RQ_IdResp = '4' 

 

Porém o meu relatório precisa ser mais eficiente, preciso combinar vários critérios, por exemplo: quantos de 15 a 20 anos possuem o 2º Grau e tentei a seguinte consulta:

 

SELECT COUNT(DISTINCT RQ_IdVisitEmpreend)  AS Total 
FROM gc_resposta_questao
WHERE (RQ_IdQuest = '1' AND RQ_IdResp = '1') 
OR (RQ_IdQuest = '2' AND RQ_IdResp = '4') 

 

Porém de maneira nenhuma consigo um resultado satisfatório.

Alguém poderia me dar uma idéia de uma instrução sql mais eficaz?

De um modo que eu posso combinar os critérios?

 

Abraço a todos.

 

Mauro

Compartilhar este post


Link para o post
Compartilhar em outros sites

 por exemplo: quantos de 15 a 20 anos possuem o 2º Grau e tentei a seguinte consulta:

 

 

...
WHERE (RQ_IdQuest = '1' AND RQ_IdResp = '1') 
OR (RQ_IdQuest = '2' AND RQ_IdResp = '4') 

 

Isto retorna os registros que tem RQ_IdQuest = '1' E RQ_IdResp = '1' OU

que tem RQ_IdQuest = '2' AND RQ_IdResp = '4', não me parece ser a resposta a pergunta.

 

Responda quantos de 15 a 20 anos , depois faça possuem o 2º Grau e junte-os AND.

 

Ajudou ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 por exemplo: quantos de 15 a 20 anos possuem o 2º Grau e tentei a seguinte consulta:

 

 

...
WHERE (RQ_IdQuest = '1' AND RQ_IdResp = '1') 
OR (RQ_IdQuest = '2' AND RQ_IdResp = '4') 

 

Isto retorna os registros que tem RQ_IdQuest = '1' E RQ_IdResp = '1' OU

que tem RQ_IdQuest = '2' AND RQ_IdResp = '4', não me parece ser a resposta a pergunta.

 

Responda quantos de 15 a 20 anos , depois faça possuem o 2º Grau e junte-os AND.

 

Ajudou ?

 

 

Eu já troquei o 'OR' pelo 'AND' e me retorna 0 (zero) registros

 

A minha necessidade é a combinação de múltiplos critérios

escolaridade - 2 grau

sexo - masculino

cidade - belo horizonte

etc.

Todos respresentados pelos seus respectivos id's tanto da pergunta quanto da resposta

 

mas estou inciando o teste com apenas dois, pensando: "Se eu faço com dois eu faço com vários, hehehehe"

 

mas com o AND não funciona:

 

SELECT COUNT( DISTINCT RQ_IdVisitEmpreend ) AS Total
FROM gc_resposta_questao
WHERE (
RQ_IdQuest = '1'
AND RQ_IdResp = '1'
)
AND (
RQ_IdQuest = '2'
AND RQ_IdResp = '4'
)

 

Mesmo estando entre parênteses o resultado é zero.

 

Talvez eu não entendi a sua resposta, tem como você, por favor, exemplificar em uma instrução sql?

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cada pergunta/Resposta é uma linha da tabela, não ?

 

Existe (caso positivo) uma Tabela com os Questionários ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cada pergunta/Resposta é uma linha da tabela, não ?

 

Existe (caso positivo) uma Tabela com os Questionários ?

 

Sim, seguem as tabelas

 

Questão:

CREATE TABLE IF NOT EXISTS `gc_questao` (
 `QST_IdQuest` int(10) NOT NULL AUTO_INCREMENT,
 `QST_Nom` varchar(200) NOT NULL,
 PRIMARY KEY (`QST_IdQuest`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

Resposta:

CREATE TABLE IF NOT EXISTS `gc_resposta` (
 `RSP_IdResp` int(10) NOT NULL AUTO_INCREMENT,
 `RSP_IdQuest` int(10) NOT NULL DEFAULT '0',
 `RSP_Nom` varchar(200) NOT NULL,
 PRIMARY KEY (`RSP_IdResp`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

Resposta x Questão:

CREATE TABLE IF NOT EXISTS `gc_resposta_questao` (
 `RQ_IdRespQuest` int(10) NOT NULL AUTO_INCREMENT,
 `RQ_IdVisitEmpreend` int(10) NOT NULL DEFAULT '0',
 `RQ_IdQuest` int(10) NOT NULL DEFAULT '0',
 `RQ_IdResp` int(10) NOT NULL DEFAULT '0',
 PRIMARY KEY (`RQ_IdRespQuest`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

Eu posso criar vários questionários com suas respectivas questões, logo quando eu faço a busca eu agrupo com o campo RQ_IdVisitEmpreend, pois ele identifica a visita em que o questionário foi respondido e cada visita corresponde a um questionário, exemplo:

SELECT COUNT(DISTINCT RQ_IdVisitEmpreend) AS Total 
FROM gc_resposta_questao
WHERE RQ_IdQuest = '1' 
AND RQ_IdResp = '4' 

 

obtenho resultados satisfatórios quando busco por um único critério, porém não consigo o mesmo quando faço combinações de critérios

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se é o que entendi vejo uma solução, algo assim

 

select *
from gc_VisitEmpreend
where IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
                         FROM gc_resposta_questao
                         WHERE RQ_IdQuest = '1' 
                         AND RQ_IdResp = '4')
and   IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
                         FROM gc_resposta_questao
                         WHERE RQ_IdQuest = '2' 
                         AND RQ_IdResp = '3')
and   IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
                         FROM gc_resposta_questao
                         WHERE RQ_IdQuest = '3' 
                         AND RQ_IdResp = '1')

 

Ou seja, cada questão num sub-select.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se é o que entendi vejo uma solução, algo assim

 

select *
from gc_VisitEmpreend
where IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
                         FROM gc_resposta_questao
                         WHERE RQ_IdQuest = '1' 
                         AND RQ_IdResp = '4')
and   IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
                         FROM gc_resposta_questao
                         WHERE RQ_IdQuest = '2' 
                         AND RQ_IdResp = '3')
and   IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
                         FROM gc_resposta_questao
                         WHERE RQ_IdQuest = '3' 
                         AND RQ_IdResp = '1')

 

Ou seja, cada questão num sub-select.

 

MARAVILHA!

Funcionou perfeitamente, jamais em minha vida eu chegaria a uma solução como esta. MUITO OBRIGADO!

Veja como ficou o código ajustado às minhas necessidades:

select COUNT(VE_IdVisitEmpreend) AS Total
from gc_visit_empreend
where VE_IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
                         FROM gc_resposta_questao
                         WHERE RQ_IdQuest = '1' 
                         AND RQ_IdResp = '1')
and   VE_IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
                         FROM gc_resposta_questao
                         WHERE RQ_IdQuest = '2' 
                         AND RQ_IdResp = '4')
and   VE_IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
                         FROM gc_resposta_questao
                         WHERE RQ_IdQuest = '3' 
                         AND RQ_IdResp = '10')
and   VE_IdVisitEmpreend in (SELECT RQ_IdVisitEmpreend
                         FROM gc_resposta_questao
                         WHERE RQ_IdQuest = '4' 
                         AND RQ_IdResp = '12')	

Meu caro Motta, às vezes faço algumas coisas boas e me acho excepcional, daí eu venho a este fórum e econtro pessoas como você e penso: "Como ainda tenho tanto a aprender... heehehhe"

 

Muito obrigado pela ajuda, tenho de apresentar o projeto amanhã e graças a você tudo correrá muito bem.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como Projeto está legal , mas uma solução profissional precisaria ser melhor pensada.

 

Boa sorte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse tipo de modelo é melhor resolvido por bancos NoSQL como MongoDB.

 

Depois de uma pesquisada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.