Ir para conteúdo
Fórum Script Brasil
  • 0

AJUDA contar registro em tabelas


eberton

Pergunta

Boa noite!

preciso criar um relatorio que mostre:

EXAME: nome do exame

CODIGO | CLIENTE | DATA

TOTAL DE EXAMES: X

as tabelas são:

tb_cadastro_exame,tb_clientes ,tb_examegeral,tb_itemexamegeral, tb_medico,tb_material,tb_convenio:

meu mysql:

Código: Selecionar tudo

SELECT
       tb_examegeral.idExameGeral AS codigo,
       tb_clientes.nome,
       tb_examegeral.dataExame,
       tb_cadastro_exame.cod_sus_exame,
       tb_cadastro_exame.nome_exame,   
       tb_convenio.razao_social
       
    FROM
       tb_cadastro_exame,tb_clientes ,tb_examegeral,tb_itemexamegeral,
       tb_medico,tb_material,tb_convenio
    WHERE
       tb_examegeral.idExameGeral = tb_itemexamegeral.idExameGeral AND
       tb_examegeral.idCliente = tb_clientes.id_cliente AND
       tb_examegeral.idMedico = tb_medico.id_medico AND
       tb_examegeral.idMaterial = tb_material.id_material AND
       tb_examegeral.idConvenio = tb_convenio.id_convenio AND
       tb_itemexamegeral.idExame = tb_cadastro_exame.id_exame AND
       tb_convenio.id_convenio = '2' AND
       tb_examegeral.dataExame BETWEEN '2013-01-01' AND '2013-01-31'
    ORDER BY
    nome_exame

beleza, aqui me retorna tudo certinho, tb_convenio.id_convenio = '2' é o convenio = SUS,

acontece que ele mostra tudo na consulta e eu preciso separar por exame na hora de mostrar na tela tipo:

EXAME: Acido Urico

CODIGO | CLIENTE | DATA

23 jose 2013-01-01

54 maria 2013-01-21

TOTAL DE EXAMES: 2

EXAME: Albumina

CODIGO | CLIENTE | DATA

33 jose 2013-01-01

24 jao 2013-01-21

25 sebastiao 2013-01-21

TOTAL DE EXAMES: 3

e assim por diante, o Layout é de menos pra montar, preciso filtrar, contar e mostrar;

tem como fazer isso por SQL? não? qual seia forma certa? como seria no php? são 60 tipos de exames, é um relatório que vai dar + ou - umas 30 folhas todos os meses

Link para o comentário
Compartilhar em outros sites

17 respostass a esta questão

Posts Recomendados

  • 0
você só precisa contar o "total de exames"?

se for, na hora do select na query use o comando SUM()

sim, com SUM() me mostra a quantidade de exmes, mas eu preciso contar cada tipo de exame e mostrar os nomes dos pacientes que fizeram ele.

então minha consulta retorna assim:

consultav.jpg

assim está quase ok, agora eu preciso separar no meu relatório e dizer que tem:

TOTAL ant HCV = 2 e assim por diante separando eles na folha

dessa forma:

captura2bmq.jpg

Link para o comentário
Compartilhar em outros sites

  • 0
além de SUM, use também o comando GROUP BY....

ele vai agrupar de acordo com a sua especificação, ai você conseguirá mostrar os nomes de cada paciente que fizeram tal exame, e também saberá qtos fizeram esse exame.

Olha! contar ou somar dá certo, mas ele agrupa e não repete! então estou perdido pensando como vou mostrar isso na tela.

Obeservem a imagem:

capturarei.jpg

está falatando a ROSE ai que fez o ANT HCV. tem como mostrar isso no PHP? como será feito? acho que não né!

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia, cara to pensando aqui tenta fazer o seguinte.

Faz um select pra saber quantos tipos de exame você tem. Feito isso você pode usar cada tipo de exame como parametro para pegar todos os pacientes que fizeram cada tipo de exame.

Seria tipo uma consulta dentro de outra consulta, começando pela consulta dos exames.

Link para o comentário
Compartilhar em outros sites

  • 0
Bom dia, cara to pensando aqui tenta fazer o seguinte.

Faz um select pra saber quantos tipos de exame você tem. Feito isso você pode usar cada tipo de exame como parametro para pegar todos os pacientes que fizeram cada tipo de exame.

Seria tipo uma consulta dentro de outra consulta, começando pela consulta dos exames.

tem como mostar como seria utilizando minha consulta ai acima. Realmente parece melhor, dai a contagem utilizaria de forma mesmo, o que ta mais pegando e mostrar o exame e todos clientes para aquele exame, QTD depois agente soma!

Link para o comentário
Compartilhar em outros sites

  • 0

Cara tentei montar aqui, não sei se vai funcionar mas acho que talvez te de uma base eu acho

$sql1 = "SELECT * FROM tb_cadastro_exame ORDER BY nome_exame GROUP BY id_exame ";  //aqui voce vai pegar as id's dos exames para usar como parametro
$query1 = mysql_query($sql1);
while($resultado1 = mysql_fetch_array($query1)){
    
    $sql2 = "SELECT
       tb_examegeral.idExameGeral AS codigo,
       tb_clientes.nome,
       tb_examegeral.dataExame,
       tb_cadastro_exame.cod_sus_exame,
       tb_cadastro_exame.nome_exame,  
       tb_convenio.razao_social
      
    FROM
       tb_cadastro_exame,tb_clientes ,tb_examegeral,tb_itemexamegeral,
       tb_medico,tb_material,tb_convenio
    WHERE
       tb_examegeral.idExameGeral = tb_itemexamegeral.idExameGeral AND
       tb_examegeral.idCliente = tb_clientes.id_cliente AND
       tb_examegeral.idMedico = tb_medico.id_medico AND
       tb_examegeral.idMaterial = tb_material.id_material AND
       tb_examegeral.idConvenio = tb_convenio.id_convenio AND
       tb_itemexamegeral.idExame = tb_cadastro_exame.$resultado1[id_exame] AND
       tb_convenio.id_convenio = '2' AND
       tb_examegeral.dataExame BETWEEN '2013-01-01' AND '2013-01-31'";

// a variavel  $resultado1[id_exame] é aonde ta sendo usada como parametro pra cada exame

    $query2 = mysql_query($sql2);
    while($resultado2 = mysql_fetch_array($query2)){
        
        //aqui você começa a dar os echos do resultado que precisa        
        
    }    
}

Link para o comentário
Compartilhar em outros sites

  • 0

Agora sim está quase lá!

Eu uso PDO então fiz uma modificação.

<table width="741" border="1">
  <tr>
    <td width="79"><span>CÓDIGO</span></td>
    <td width="372" colspan="2"><span>CLIENTE</span></td>
    <td width="95" colspan="2"><span>DATA</span></td>
  </tr>
<?php
$sql_select = "SELECT id_exame,nome_exame,cod_sus_exame FROM tb_cadastro_exame  
                GROUP BY id_exame ORDER BY nome_exame";
try {
    $query_select = $conecta->prepare($sql_select);
    $query_select->execute();
    $resultado = $query_select->fetchAll(PDO::FETCH_ASSOC);
    
}catch (PDOException $e){
    echo 'Erro ao Selecionar: '.$e->getMessage();
}

    foreach ($resultado as $linha){
        $exameId = $linha['id_exame'];
$sql2 = "SELECT
       tb_examegeral.idExameGeral AS codigo,
       tb_clientes.nome,
       DATE_FORMAT(tb_examegeral.dataExame,'%d/%m/%Y') AS newData,
       tb_cadastro_exame.cod_sus_exame,
       tb_cadastro_exame.nome_exame,  
       tb_convenio.razao_social     
    FROM
       tb_cadastro_exame,tb_clientes ,tb_examegeral,tb_itemexamegeral,
       tb_medico,tb_material,tb_convenio
    WHERE
       tb_examegeral.idExameGeral = tb_itemexamegeral.idExameGeral AND
       tb_examegeral.idCliente = tb_clientes.id_cliente AND
       tb_examegeral.idMedico = tb_medico.id_medico AND
       tb_examegeral.idMaterial = tb_material.id_material AND
       tb_examegeral.idConvenio = tb_convenio.id_convenio AND
       tb_itemexamegeral.idExame = $exameId AND
       tb_convenio.id_convenio = '2' AND
       tb_examegeral.dataExame BETWEEN '2013-01-01' AND '2013-01-31'
       GROUP BY nome";

// a variavel  $resultado1[id_exame] é aonde ta sendo usada como parametro pra cada exame
    try {
        $query2 = $conecta->prepare($sql2 );
        $query2->execute();
        $resultado2 = $query2->fetchAll(PDO::FETCH_ASSOC);
    }catch (PDOException $e){
            echo 'Erro ao Selecionar: '.$e->getMessage();
    } 

    foreach ($resultado2 as $res){
        //aqui você começa a dar os echos do resultado que precisa 
            ?>
            
            <tr>
                   <td><?php echo $res['codigo']; ?></td>
                <td colspan="2" align="left"><div align="left"><?php echo utf8_decode($res['nome']); ?></div></td>
                <td colspan="2"><?php echo $res['newData'];?></td>
            </tr> 
        
       
<?php } 
}?>

O resultado é esse, é exatamento a quatidade de exames efetuados até o momento, 55 exames.

capturarqgy.jpg

achei que iria conseguir separar e somar com HTML e tabelas e tal, mas to levando uma coça. tenho que tentar aproximar o máximo daquela que está em cima.

Pode dar mais uma força!

captura2bmq.jpg

Editado por eberton
Link para o comentário
Compartilhar em outros sites

  • 0

Cara pelo que entendi agora os resultados tão saindo tudo em uma única tabela ? É isso ?

Bom com base no código que você postou ai eu mudei um pouco, tenta usar o que vou postar aqui e vamo vê no que dá.

<?php
$sql_select = "SELECT id_exame,nome_exame,cod_sus_exame FROM tb_cadastro_exame
                GROUP BY id_exame ORDER BY nome_exame";
try {
    $query_select = $conecta->prepare($sql_select);
    $query_select->execute();
    $resultado = $query_select->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    echo 'Erro ao Selecionar: ' . $e->getMessage();
}

foreach ($resultado as $linha) {
    $exameId = $linha['id_exame'];
    $sql2 = "SELECT
       tb_examegeral.idExameGeral AS codigo,
       tb_clientes.nome,
       DATE_FORMAT(tb_examegeral.dataExame,'%d/%m/%Y') AS newData,
       tb_cadastro_exame.cod_sus_exame,
       tb_cadastro_exame.nome_exame,
       tb_convenio.razao_social
    FROM
       tb_cadastro_exame,tb_clientes ,tb_examegeral,tb_itemexamegeral,
       tb_medico,tb_material,tb_convenio
    WHERE
       tb_examegeral.idExameGeral = tb_itemexamegeral.idExameGeral AND
       tb_examegeral.idCliente = tb_clientes.id_cliente AND
       tb_examegeral.idMedico = tb_medico.id_medico AND
       tb_examegeral.idMaterial = tb_material.id_material AND
       tb_examegeral.idConvenio = tb_convenio.id_convenio AND
       tb_itemexamegeral.idExame = $exameId AND
       tb_convenio.id_convenio = '2' AND
       tb_examegeral.dataExame BETWEEN '2013-01-01' AND '2013-01-31'
       GROUP BY nome";

// a variavel  $resultado1[id_exame] é aonde ta sendo usada como parametro pra cada exame
    try {
        $query2 = $conecta->prepare($sql2);
        $query2->execute();
        $resultado2 = $query2->fetchAll(PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        echo 'Erro ao Selecionar: ' . $e->getMessage();
    }
    ?>
    <table width="741" border="1">
        <thead>
            <tr>
                <td width="79"><span>CÓDIGO</span></td>
                <td width="372" colspan="2"><span>CLIENTE</span></td>
                <td width="95" colspan="2"><span>DATA</span></td>
            </tr>
        </thead>
        <tbody>
            <?php
            foreach ($resultado2 as $res) {
                //aqui você começa a dar os echos do resultado que precisa
                ?>
                <tr>
                    <td><?php echo $res['codigo']; ?></td>
                    <td colspan="2" align="left"><div align="left"><?php echo utf8_decode($res['nome']); ?></div></td>
                    <td colspan="2"><?php echo $res['newData']; ?></td>
                </tr>

                <?php
            }
            ?>
        </tbody>
    </table>
    <?php
}
?>

Se der certo ele vai montar várias tabelas agora.

Link para o comentário
Compartilhar em outros sites

  • 0

sim, sim, é quase é isso mesmo, o problema está em organizar a tabela mesmo! e depois tenho que fazer as contagem em cada um agrupamento o COUNT ou SUM.

neste caso vou tentar usar o

<?php echo $query2->rowCount();?>
que me parece que está dando certo com as contagens! Essa modificação que você fez eu havia feito ontem também, e ele DIVIDE, mas também repete isso. tabela4.jpg acima do campo CÓDIGO, tem também que sair o NOME DO EXAME e COD.SUS do exame, coloquei! vaja como ficou o código agora:
<?php
$sql_select = "SELECT id_exame,nome_exame,cod_sus_exame FROM tb_cadastro_exame
                GROUP BY id_exame ORDER BY nome_exame";
try {
    $query_select = $conecta->prepare($sql_select);
    $query_select->execute();
    $resultado = $query_select->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    echo 'Erro ao Selecionar: ' . $e->getMessage();
}

foreach ($resultado as $linha) {
    $exameId = $linha['id_exame'];
    $sql2 = "SELECT
       tb_examegeral.idExameGeral AS codigo,
       tb_clientes.nome,
       DATE_FORMAT(tb_examegeral.dataExame,'%d/%m/%Y') AS newData,
       tb_cadastro_exame.cod_sus_exame,
       tb_cadastro_exame.nome_exame,
       tb_convenio.razao_social
    FROM
       tb_cadastro_exame,tb_clientes ,tb_examegeral,tb_itemexamegeral,
       tb_medico,tb_material,tb_convenio
    WHERE
       tb_examegeral.idExameGeral = tb_itemexamegeral.idExameGeral AND
       tb_examegeral.idCliente = tb_clientes.id_cliente AND
       tb_examegeral.idMedico = tb_medico.id_medico AND
       tb_examegeral.idMaterial = tb_material.id_material AND
       tb_examegeral.idConvenio = tb_convenio.id_convenio AND
       tb_itemexamegeral.idExame = $exameId AND
       tb_convenio.id_convenio = '2' AND
       tb_examegeral.dataExame BETWEEN '2013-01-01' AND '2013-01-31'
       GROUP BY tb_clientes.nome";

// a variavel  $resultado1[id_exame] é aonde ta sendo usada como parametro pra cada exame
    try {
        $query2 = $conecta->prepare($sql2);
        $query2->execute();
        $resultado2 = $query2->fetchAll(PDO::FETCH_ASSOC);
    } catch (PDOException $e) {
        echo 'Erro ao Selecionar: ' . $e->getMessage();
    }
    ?>
<table width="735">
    <tr>
        <td width="79">Exame:</td>
        <td width="372" colspan="2" align="left"><?php echo $linha['nome_exame'];?></td>
        <td width="95" colspan="2">Cod.SUS</td>
        <td width="95" colspan="2" align="left"><?php echo $linha['cod_sus_exame'];?></td>
    </tr>
    </table>
   
    <table width="741" border="1">
        <thead>
            <tr>
                <td width="79"><span>CODIGO</span></td>
                <td width="372" colspan="2"><span>CLIENTE</span></td>
                <td width="95" colspan="2"><span>DATA</span></td>
            </tr>
      </thead>
        <tbody>
            <?php
            
            foreach ($resultado2 as $res) {
                //aqui você começa a dar os echos do resultado que precisa
                ?>
                
                <tr>
                    <td><?php echo $res['codigo']; ?></td>
                    <td colspan="2" align="left"><div align="left"><?php echo utf8_decode($res['nome']); ?></div></td>
                    <td colspan="2"><?php echo $res['newData']; ?></td>
                </tr>


                <?php
            }
            ?>                <tr>
                     <td colspan="3" align="right">Total de Exames:</td>
                  <td><?php echo $query2->rowCount();?></td>
                </tr>
        </tbody>
</table><br />
    <?php
}
?>

o que está acontecendo é que mesmo os exames que não foram feitos aparece o nome deles, acho que temos que tentar filtrar alguma coisa?

vocês está me ajudando muito, se quiser te mando o banco de dados?

Editado por eberton
Link para o comentário
Compartilhar em outros sites

  • 0

Cara fiz um if aqui com base no ultimo código que você postou, acho que já resolve o problema das tabelas sem exames feitos.

<?php
$sql_select = "SELECT id_exame,nome_exame,cod_sus_exame FROM tb_cadastro_exame
                GROUP BY id_exame ORDER BY nome_exame";
try {
    $query_select = $conecta->prepare($sql_select);
    $query_select->execute();
    $resultado = $query_select->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
    echo 'Erro ao Selecionar: ' . $e->getMessage();
}

foreach ($resultado as $linha) {
    $exameId = $linha['id_exame'];
    $sql2 = "SELECT
       tb_examegeral.idExameGeral AS codigo,
       tb_clientes.nome,
       DATE_FORMAT(tb_examegeral.dataExame,'%d/%m/%Y') AS newData,
       tb_cadastro_exame.cod_sus_exame,
       tb_cadastro_exame.nome_exame,
       tb_convenio.razao_social
    FROM
       tb_cadastro_exame,tb_clientes ,tb_examegeral,tb_itemexamegeral,
       tb_medico,tb_material,tb_convenio
    WHERE
       tb_examegeral.idExameGeral = tb_itemexamegeral.idExameGeral AND
       tb_examegeral.idCliente = tb_clientes.id_cliente AND
       tb_examegeral.idMedico = tb_medico.id_medico AND
       tb_examegeral.idMaterial = tb_material.id_material AND
       tb_examegeral.idConvenio = tb_convenio.id_convenio AND
       tb_itemexamegeral.idExame = $exameId AND
       tb_convenio.id_convenio = '2' AND
       tb_examegeral.dataExame BETWEEN '2013-01-01' AND '2013-01-31'
       GROUP BY tb_clientes.nome";

// a variavel  $resultado1[id_exame] é aonde ta sendo usada como parametro pra cada exame
    try {
        $query2 = $conecta->prepare($sql2);
        $query2->execute();
        $resultado2 = $query2->fetchAll(PDO::FETCH_ASSOC);
        $tot_exames = $query2->rowCount();
    } catch (PDOException $e) {
        echo 'Erro ao Selecionar: ' . $e->getMessage();
    }
    //caso tenha exames imprime a tabela
    if($tot_exames != 0){
    ?>
    <table width="735">
        <tr>
            <td width="79">Exame:</td>
            <td width="372" colspan="2" align="left"><?php echo $linha['nome_exame']; ?></td>
            <td width="95" colspan="2">Cod.SUS</td>
            <td width="95" colspan="2" align="left"><?php echo $linha['cod_sus_exame']; ?></td>
        </tr>
    </table>

    <table width="741" border="1">
        <thead>
            <tr>
                <td width="79"><span>CODIGO</span></td>
                <td width="372" colspan="2"><span>CLIENTE</span></td>
                <td width="95" colspan="2"><span>DATA</span></td>
            </tr>
        </thead>
        <tbody>
            <?php
            foreach ($resultado2 as $res) {
                //aqui você começa a dar os echos do resultado que precisa
                ?>

                <tr>
                    <td><?php echo $res['codigo']; ?></td>
                    <td colspan="2" align="left"><div align="left"><?php echo utf8_decode($res['nome']); ?></div></td>
                    <td colspan="2"><?php echo $res['newData']; ?></td>
                </tr>


                <?php
            }
            ?>                <tr>
                <td colspan="3" align="right">Total de Exames:</td>
                <td><?php echo $tot_exames ?></td>
            </tr>
        </tbody>
    </table><br />
    <?php
    }else{
        // se não tiver exames não imprime a tabela
    }
}
?>

Link para o comentário
Compartilhar em outros sites

  • 0

Bingo!

perfeito!

utilizei um IF, mas foi diferente e continuava imprimindo!

ficou filé aqui, agora é só estilizar!

----

tenho mais 3 exames que tem que sair aqui nesse mesmo relatório que estão em tabelas separadas, mas eu consigo colocar eles para sairem por último que é o de

HEMOGRAMA, Cultura e Antibiograma e Urina. Mas isso eu adaptar olhando os código que acho que vai dar certo.

já posto aqui o resultado daqui a pouco. Se der certo já dou por resolvido!

por enquanto agradeço muito

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...