Ajuda com SQL (Count)
Olá pessoal! Estou precisando da ajuda de vcs com um SQL. Estou fazendo um sistema de opiniao pública onde no final de cada questionario respondido o usuario do sistema precisaria fazer a contagem das respostas de algumas perguntas. Essa contagem pode ser de 1 unica pergunta ou com até 3 perguntas juntas. Tenho no BD a tabela de respostas onde cada resposta pergunta respondida corresponde a uma linha na tabela. Abaixo está o SQL:
Select COUNT(DISTINCT R1.CODQUESTIONARIO) RESPOSTA
From OP_RESPOSTA R1, OP_RESPOSTA R2, OP_RESPOSTA R3
Where R1.CODPESQUISA = R2.CODPESQUISA
And R1.CODPESQUISA = R3.CODPESQUISA
And R1.CODCLIENTE = R2.CODCLIENTE
And R1.CODCLIENTE = R3.CODCLIENTE
And R1.CODQUESTIONARIO = R2.CODQUESTIONARIO
And R1.CODQUESTIONARIO = R3.CODQUESTIONARIO
And R1.CODPESQUISA = 16
And R1.CODCLIENTE = 1
And R1.CODPERGUNTA = 7
And R1.CODALTERNATIVA = 144
And R2.CODPERGUNTA = 13
And R2.CODALTERNATIVA IN (251,251,253)
And R3.CODPERGUNTA = 15
And R3.CODALTERNATIVA IN (282,283)
Explicando esse SQL tenho q contar qtos questionarios responderam a pergunta 7 com a alternativa 144 + pergunta 13 com as alternativas 251,251,253 + a pergunta 15 com as altenativas 282,283. O conteudo do IN () seria as repostas de multiplas escolhas.
O problema é o comando ´ IN (251,251,253)´ e o ´IN (282,283)´ pois ele está contando as respostas que tem, por exemplo: (251,251,253,254,255), (251,253,254), etc.
Eu precisaria contar apenas os questionarios que tenham exatamente essas alternaitvas respondidas.
Valeu! Obrigado!
OBS: D7 + Firebird
Select COUNT(DISTINCT R1.CODQUESTIONARIO) RESPOSTA
From OP_RESPOSTA R1, OP_RESPOSTA R2, OP_RESPOSTA R3
Where R1.CODPESQUISA = R2.CODPESQUISA
And R1.CODPESQUISA = R3.CODPESQUISA
And R1.CODCLIENTE = R2.CODCLIENTE
And R1.CODCLIENTE = R3.CODCLIENTE
And R1.CODQUESTIONARIO = R2.CODQUESTIONARIO
And R1.CODQUESTIONARIO = R3.CODQUESTIONARIO
And R1.CODPESQUISA = 16
And R1.CODCLIENTE = 1
And R1.CODPERGUNTA = 7
And R1.CODALTERNATIVA = 144
And R2.CODPERGUNTA = 13
And R2.CODALTERNATIVA IN (251,251,253)
And R3.CODPERGUNTA = 15
And R3.CODALTERNATIVA IN (282,283)
Explicando esse SQL tenho q contar qtos questionarios responderam a pergunta 7 com a alternativa 144 + pergunta 13 com as alternativas 251,251,253 + a pergunta 15 com as altenativas 282,283. O conteudo do IN () seria as repostas de multiplas escolhas.
O problema é o comando ´ IN (251,251,253)´ e o ´IN (282,283)´ pois ele está contando as respostas que tem, por exemplo: (251,251,253,254,255), (251,253,254), etc.
Eu precisaria contar apenas os questionarios que tenham exatamente essas alternaitvas respondidas.
Valeu! Obrigado!
OBS: D7 + Firebird
Rssampaio
Curtidas 0
Respostas
Rjun
26/08/2005
O uso de parenteses deve resolver seu problema.
Select COUNT(DISTINCT R1.CODQUESTIONARIO) RESPOSTA From OP_RESPOSTA R1, OP_RESPOSTA R2, OP_RESPOSTA R3 Where R1.CODPESQUISA = R2.CODPESQUISA And R1.CODPESQUISA = R3.CODPESQUISA And R1.CODCLIENTE = R2.CODCLIENTE And R1.CODCLIENTE = R3.CODCLIENTE And R1.CODQUESTIONARIO = R2.CODQUESTIONARIO And R1.CODQUESTIONARIO = R3.CODQUESTIONARIO And R1.CODPESQUISA = 16 And R1.CODCLIENTE = 1 And (R1.CODPERGUNTA = 7 And R1.CODALTERNATIVA = 144) And (R2.CODPERGUNTA = 13 And R2.CODALTERNATIVA IN (251,251,253)) And (R3.CODPERGUNTA = 15 And R3.CODALTERNATIVA IN (282,283) )
GOSTEI 0
Rssampaio
26/08/2005
Rjun, não é kara...mas valeu! pela ajuda...
O problema é cada alternatina q tem dentro do ´IN´ e tive alguma delas em outros questionarios ele vai contar esse questionario.
E corrigindo ae a linha R2.CODALTERNATIVA IN (251,251,253)
seria isso: R2.CODALTERNATIVA IN (251,252,253), uma sequencia.
Valeu!
O problema é cada alternatina q tem dentro do ´IN´ e tive alguma delas em outros questionarios ele vai contar esse questionario.
E corrigindo ae a linha R2.CODALTERNATIVA IN (251,251,253)
seria isso: R2.CODALTERNATIVA IN (251,252,253), uma sequencia.
Valeu!
GOSTEI 0
Rjun
26/08/2005
Deixa ver se eu entendi bem:
Para a pergunta 13 as respostas válidas são : 251, 252 e 253
Para a pargunte 15 as respostas válidas são : 282 e 283
Mas o select esta retornando para a pergunta 13 respostas entre 251 e 255?...é isso?
Para a pergunta 13 as respostas válidas são : 251, 252 e 253
Para a pargunte 15 as respostas válidas são : 282 e 283
Mas o select esta retornando para a pergunta 13 respostas entre 251 e 255?...é isso?
GOSTEI 0
Rssampaio
26/08/2005
Isso mesmo Rjun!
Se por Exemplo um outro questionario respondeu a pergunta 13 com as alternativas 251,252,253,254,255 ele tb está contando este questionario.
Se tiver outro questiona com as alternativas 253,254,255 ele tb conta.
As respostas de Multiplas escolha válida seria somente as alternativas (251,252,253) e (281,281) da pergunta 13 e 15 respectivamente.
Se por Exemplo um outro questionario respondeu a pergunta 13 com as alternativas 251,252,253,254,255 ele tb está contando este questionario.
Se tiver outro questiona com as alternativas 253,254,255 ele tb conta.
As respostas de Multiplas escolha válida seria somente as alternativas (251,252,253) e (281,281) da pergunta 13 e 15 respectivamente.
GOSTEI 0
Rjun
26/08/2005
Outra dúvida. Como esta sua tabela de respostas? No caso para a pergunta 13 com as respostas 251, 252, 253, 254 e 255, ela teria 5 linhas.
É isso?
13 251 13 252 13 253 13 254 13 255
É isso?
GOSTEI 0
Rssampaio
26/08/2005
Exatamente Rjun!
Cada resposta que é dada é uma linha na tabela.
Minha tabela de resposta tem os seguinte campos:
CODRESPOSTA INTEGER NOT NULL,
CODPERGUNTA INTEGER NOT NULL,
CODQUESTIONARIO INTEGER NOT NULL,
CODALTERNATIVA INTEGER,
DTARESPOSTA DATE
O CODRESPOSTA é um seguencial da tabela, PK.
Cada resposta que é dada é uma linha na tabela.
Minha tabela de resposta tem os seguinte campos:
CODRESPOSTA INTEGER NOT NULL,
CODPERGUNTA INTEGER NOT NULL,
CODQUESTIONARIO INTEGER NOT NULL,
CODALTERNATIVA INTEGER,
DTARESPOSTA DATE
O CODRESPOSTA é um seguencial da tabela, PK.
GOSTEI 0
Rjun
26/08/2005
Então se o Cliente 1 respondeu para a pergunta 13 as opções 251, 252, 253 e 254 então ele não poderia entrar no seu select? Só deveria entrar se ele respondesse 251, 252 e 253? É isso?
GOSTEI 0
Rssampaio
26/08/2005
Isso...somente respondeu exatamente as 3 alternativas, o resto ele nao pode contar.
blz!
blz!
GOSTEI 0