Ir para conteúdo

POWERED BY:

Arquivado

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

Ilano

O q há de errado nesta consulta?

Recommended Posts

Olá pessoal,

 

Uso MySQL 5. Estou precisando fazer uma consulta q me traga o total por titulação e sexo. Para isto estou tentando fazer a consulta abaixo, mas não está dando certo.

 

SELECT T.Tit_Nome,

(ISNULL(

Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "M"

), 0) AS MASCULINO,

 

(ISNULL(

Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "F"

), 0) AS FEMININO

FROM tb_dadospessoais P

INNER JOIN tb_dadosfuncionais F ON P.DP_Codigo = F.DP_Codigo

INNER JOIN tb_titulacao T ON F.Tit_Codigo = T.Tit_Codigo

O erro retornado é esse:

 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "M"

), 0) AS MASCU' at line 3

 

Se eu fizer a consulta como a seguinte dá certo, porém os resultados não retornam corretamente:

 

SELECT T.Tit_Nome,

(

Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "M"

) AS MASCULINO,

 

(

Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "F"

) AS FEMININO

FROM tb_dadospessoais P

INNER JOIN tb_dadosfuncionais F ON P.DP_Codigo = F.DP_Codigo

INNER JOIN tb_titulacao T ON F.Tit_Codigo = T.Tit_Codigo

O resultado retornado é este:

 

Tit_Nome____________MASCULINO_____FEMININO
GRADUAÇÃO_________1______________1
PÓS-GRADUAÇÃO_____1______________1

Só q eu tenho apenas um de cada sexo de cada titulação, ou seja, o resultado deveria ser retornado assim:

 

Tit_Nome____________MASCULINO_____FEMININO
GRADUAÇÃO_________1______________0
PÓS-GRADUAÇÃO_____0______________1

O q está errado na primeira consulta deste post?

 

Grato,

 

Ilano.

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá!

 

bom, você está fazendo Subquery, já que está fazendo SELECT dentro de SELECT.

Então para que uma subquery seja executada, ela deve estar entre parênteses próprios pra sub. É... sim sim, está entre parenteses na sua consulta, MAS, estes parenteses são da função ISNULL().

Então deveria estar deste jeito:

SELECT T.Tit_Nome,

(ISNULL(

(Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "M")

), 0) AS MASCULINO,

 

(ISNULL(

(Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "F")

), 0) AS FEMININO

FROM tb_dadospessoais P

INNER JOIN tb_dadosfuncionais F ON P.DP_Codigo = F.DP_Codigo

INNER JOIN tb_titulacao T ON F.Tit_Codigo = T.Tit_Codigo

Agora deve funcionar...

 

bom, acredito eu que a razão de estar vindo resultado incorreto é que a cada subquery executada, está verificando apenas o SEXO. Você tem que definir o restante do filtro que deseja, também, nas subqueries (além do sexo).

 

qquer dúvida só postar. OU, se não for isto o que eu disse, explica com mais detalhes se puder.

 

até

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega Cassitos,

 

Desde já agradeço sua atenção.

 

Retornou o erro:

 

Operand should contain 1 column(s)

Compartilhar este post


Link para o post
Compartilhar em outros sites

hummmm.... :mellow:

...

...

me diz... você está utilizando este ISNULL p/ saber se o resultado desta subquery é Nula (dãã...), se for então retorna 0.

Bom, acontece que você precisa utilizar o IF para o mysql saber como tratar o valor do ISNULL.

 

Algo do tipo:

SELECT T.Tit_Nome,

IF(ISNULL(

(Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "M")

), 0, 1) AS MASCULINO,

 

IF(ISNULL(

(Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "F")

), 0, 1) AS FEMININO

FROM tb_dadospessoais P

INNER JOIN tb_dadosfuncionais F ON P.DP_Codigo = F.DP_Codigo

INNER JOIN tb_titulacao T ON F.Tit_Codigo = T.Tit_Codigo

Mas pelo que vi, este ISNULL retorna 0(false) ou 1(true).

A sintaxe do IF é:

IF(expressão, verdadeiro, falso).

Mas se você quer que retorne o resultado daquele count na subquery, este ISNULL vai atrapalhar. Já que quer a quantidade, e deste jeito estará retornando 0(ISNULL é verdadeiro, não retornou nada da subquery) ou 1(ISNULL é false, encontrou algum conteúdo da subquery).

 

Acho que esta consulta é mais adequada (que você já testou). Só precisa acertar as subqueries, pois só a condição sexo está retornando resultado que não deveria. tem que complementar o WHERE delas também com os demais filtros que precise.

SELECT T.Tit_Nome,

(Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "M")

AS MASCULINO,

(Select COUNT(*) ITEM

From tb_dadospessoais

Where DP_Sexo = "F") AS FEMININO

FROM tb_dadospessoais P

INNER JOIN tb_dadosfuncionais F ON P.DP_Codigo = F.DP_Codigo

INNER JOIN tb_titulacao T ON F.Tit_Codigo = T.Tit_Codigo

você está usando este ISNULL pq deu algum erro por causa de valor NULL no programa que você está utilizando? Pq se isto não for atrapalhar, não precisa utilizar nem IF nem ISNULL... só as subqueries com o where devidamente corrigido.

 

tenta algo assim:

SELECT T.Tit_Nome,

(Select COUNT(*) ITEM

From tb_dadospessoais A

Where DP_Sexo = "M" AND A.DP_Codigo = F.DP_Codigo)

AS MASCULINO,

(Select COUNT(*) ITEM

From tb_dadospessoais B

Where DP_Sexo = "F" AND B.DP_Codigo = F.DP_Codigo) AS FEMININO

FROM tb_dadospessoais P

INNER JOIN tb_dadosfuncionais F ON P.DP_Codigo = F.DP_Codigo

INNER JOIN tb_titulacao T ON F.Tit_Codigo = T.Tit_Codigo

flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá cassitos,

 

me diz... você está utilizando este ISNULL p/ saber se o resultado desta subquery é Nula (dãã...), se for então retorna 0.
Bom, acontece que você precisa utilizar o IF para o mysql saber como tratar o valor do ISNULL.

Realmente, analisando bem, você está com razão.

 

A última consulta já postou

 

SELECT T.Tit_Nome,

(Select COUNT(*) ITEM

From tb_dadospessoais A

Where DP_Sexo = "M" AND A.DP_Codigo = F.DP_Codigo)

AS MASCULINO,

(Select COUNT(*) ITEM

From tb_dadospessoais B

Where DP_Sexo = "F" AND B.DP_Codigo = F.DP_Codigo) AS FEMININO

FROM tb_dadospessoais P

INNER JOIN tb_dadosfuncionais F ON P.DP_Codigo = F.DP_Codigo

INNER JOIN tb_titulacao T ON F.Tit_Codigo = T.Tit_Codigo

Chegou bem próximo ao q pretendo os dados agora estão retornando assim:

 

Tit_Nome_____________MASCULINO FEMININO

GRADUAÇÃO__________1__________0

PÓS-GRADUAÇÃO______0__________1

GRADUAÇÃO__________1__________0

 

Talvez, eu precise fazer isso com uma tabela temporária mesmo, se não der pra exibir os dados como pretendo usando instrução SQL:

 

Tit_Nome_____________MASCULINO FEMININO

GRADUAÇÃO__________2__________0

PÓS-GRADUAÇÃO______0__________1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Select TITULO TITULO, SUM(MAS) MAS ,SUM(FEM) FROM

(

SELECT

T.Tit_Nome TITULO,

 

if( P.DP_SEXO = "M" ,1,0) AS MAS,

if( P.DP_SEXO = "F" ,1,0) AS FEM

 

FROM tb_dadospessoais P ,tb_dadosfuncionais ,tb_titulacao

Where

P.DP_Codigo = F.DP_Codigo AND

F.Tit_Codigo = T.Tit_Codigo

)abc

Group by TITULO

Compartilhar este post


Link para o post
Compartilhar em outros sites

ae,

o camarada giesta matou o problema.

 

só faltou colocar os alias nas tabelas p/ não erro na consulta:

Select TITULO TITULO, SUM(MAS) ,SUM(FEM) FROM ( SELECT T.Tit_Nome TITULO,

 

if( P.DP_SEXO = "M" ,1,0) AS MAS,

if( P.DP_SEXO = "F" ,1,0) AS FEM

 

FROM tb_dadospessoais P ,tb_dadosfuncionais F,tb_titulacao T

Where P.DP_Codigo = F.DP_Codigo AND

F.Tit_Codigo = T.Tit_Codigo )abc

Group by TITULO

acho que agora é problema resolvido.

 

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

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.