Ilano 0 Denunciar post Postado Agosto 2, 2008 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
cassitos 2 Denunciar post Postado Agosto 3, 2008 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
Ilano 0 Denunciar post Postado Agosto 3, 2008 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
cassitos 2 Denunciar post Postado Agosto 3, 2008 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
Ilano 0 Denunciar post Postado Agosto 3, 2008 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
giesta 29 Denunciar post Postado Agosto 3, 2008 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
cassitos 2 Denunciar post Postado Agosto 3, 2008 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
Ilano 0 Denunciar post Postado Agosto 4, 2008 Valeu galera!!!! Agora é problema resolvido sim! Ficou filé!!!! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Obrigadão a todos!!!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif Compartilhar este post Link para o post Compartilhar em outros sites