Ir para conteúdo
Ricardo de Souza Rodrigues

Comparação de dados (Linhas de uma tabela)

Recommended Posts

Prezados,  boa tarde. 

Tenho o seguinte script que me apresenta uma lista com todos os pacientes que tiveram mais de uma passagem por determinado setor.  Abaixo segue exemplo de 4 registros do resultado:

 

11/2018    60574    211701    12/11/2018      01/11/2018      14/11/2018  
11/2018    61038    211701    21/11/2018      01/11/2018      22/11/2018 
10/2018    59506    208314    25/10/2018      01/10/2018      27/10/2018  
10/2018    59703    208314    28/10/2018      01/10/2018      29/10/2018  

 

Como podem ver tenho dois registros do atendimento 211701 e dois registros do atendimento 208314, cada um com um código de movimentação único (significando que o segundo registro é uma reinternação). 

A minha necessidade é apresentar apenas o registro de reinternação que for em no máximo 2 dias, ou seja, a data da reinternação (DT_MOV_INT ) tem que ser menor que a data da liberação da primeira entrada (DT_LIB_MOV ) + 2 (DT_MOV_INT < DT_LIB_MOV + 2). 

 

SELECT 
     TO_CHAR(MI.DT_MOV_INT,'MM/YYYY') MES
    ,MI.CD_MOV_INT
    ,MI.CD_ATENDIMENTO 
    ,MI.DT_MOV_INT
    ,MI.HR_MOV_INT
    ,MI.DT_LIB_MOV
FROM MOV_INT MI
  INNER JOIN 
    (
    SELECT 
        --COUNT(M.CD_ATENDIMENTO),
        M.CD_ATENDIMENTO
    FROM  MOV_INT M 
      INNER JOIN LEITO L
        ON M.CD_LEITO = L.CD_LEITO
      INNER JOIN UNID_INT U
        ON L.CD_UNID_INT = U.CD_UNID_INT
    WHERE 
        U.CD_UNID_INT = 67
        AND M.CD_ATENDIMENTO IS NOT NULL
        AND M.CD_LEITO_ANTERIOR NOT IN (243,242,166,165,164,163,162,161,160,159)
        AND M.CD_LEITO_ANTERIOR IS NOT NULL
    GROUP BY M.CD_ATENDIMENTO
    HAVING COUNT(M.CD_ATENDIMENTO) > 1
    ORDER BY M.CD_ATENDIMENTO DESC
    ) ATEND
     ON MI.CD_ATENDIMENTO = ATEND.CD_ATENDIMENTO
    INNER JOIN LEITO L -- tabela de leitos
     ON MI.CD_LEITO = L.CD_LEITO
    INNER JOIN UNID_INT U -- tabela de unidades de internação
     ON L.CD_UNID_INT = U.CD_UNID_INT
WHERE U.CD_UNID_INT = 67
 AND MI.CD_ATENDIMENTO IS NOT NULL
 AND MI.CD_LEITO_ANTERIOR NOT IN (243,242,166,165,164,163,162,161,160,159)
 AND MI.CD_LEITO_ANTERIOR IS NOT NULL
ORDER BY 3 DESC;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por que a query interna (tabela virtual) tem joins ?

Eu faria um EXISTS  em uma subquery

 

SELECT *
FROM MOV_INT MI
WHERE EXISTS (SELECT NULL
              FROM MOV_INT MI2
              WHERE MI2.CD_ATENDIMENTO  = MI.CD_ATENDIMENTO 
              AND (MI.DT_MOV_INT < MI2DT_LIB_MOV + 2))

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Motta disse:

Por que a query interna (tabela virtual) tem joins ?

Eu faria um EXISTS  em uma subquery

 


SELECT *
FROM MOV_INT MI
WHERE EXISTS (SELECT NULL
              FROM MOV_INT MI2
              WHERE MI2.CD_ATENDIMENTO  = MI.CD_ATENDIMENTO 
              AND (MI.DT_MOV_INT < MI2DT_LIB_MOV + 2))

 

Na query interna quero identificar quem tem mais de uma passagem pela unidade de internação 67. Depois de identificar esses atendimento, faço o join com a tabela de movimentações para apenas destes apresentar os dados que preciso, ou seja, alguns vão ter duas linhas, outros três linhas, de acordo com quantas vezes retornou a unidade de internação 67 no mesmo atendimento. 

 

Porém não consegui identificar como posso fazer aquela análise do período entre essas repetições.

 

Tentei executar a query informada, mas deu erro.

 

ORA-00911: caractere inválido
00911. 00000 -  "invalid character"
*Cause:    identifiers may not start with any ASCII character other than
           letters and numbers.  $#_ are also allowed after the first
           character.  Identifiers enclosed by doublequotes may contain
           any character other than a doublequote.  Alternative quotes
           (q'#...#') cannot use spaces, tabs, or carriage returns as
           delimiters.  For all other contexts, consult the SQL Language
           Reference Manual.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os dois dias tem de seguir a mesma regra de unidade , leito etc ?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então... Pensando no que preciso... 

Preciso de todos os atendimentos que tiveram mais de uma passagem na UTI (U.CD_UNID_INT = 67) e que o leito anterior não tenha sido da UTI (CD_LEITO_ANTERIOR NOT IN (243,242,166,165,164,163,162,161,160,159)), pois as vezes ele transfere de leito dentro da própria UTI.

Ai esse script me traz todos esses atendimentos apresentando os que tem mais de uma incidência na UTI após outro leito sem ser UTI. 

Mas ai não sei como comparo para ver se a data de entrada do registro 2 é maior ou igual que a saída do registro 1 + 2 (ou mais 3 - regra para definir em quantos dias voltou).

Ficou claro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça a sua query ser uma tabela virtual e a compareca uma cópia dela mesma , eu pensaria o caso de criar uma view dela , é bom no caso de queries complicadas pois o sql fica simples.

 

Em regras muito complicadas também se pode pensar o caso de uma FUNCTION que retorne uma condição de reinternação , já fiz algo parecido até para reinternação hospitalar mesmo.

 

A vantagem da FUNCTION é poder ter cursor etc , só tome cuidado para ela ser otimizada e rápida.

Compartilhar este post


Link para o post
Compartilhar em outros sites
13 horas atrás, Motta disse:

Faça a sua query ser uma tabela virtual e a compareca uma cópia dela mesma , eu pensaria o caso de criar uma view dela , é bom no caso de queries complicadas pois o sql fica simples.

 

Em regras muito complicadas também se pode pensar o caso de uma FUNCTION que retorne uma condição de reinternação , já fiz algo parecido até para reinternação hospitalar mesmo.

 

A vantagem da FUNCTION é poder ter cursor etc , só tome cuidado para ela ser otimizada e rápida.

Fiz a view e deu certo. Show de bola!

Obrigado pelo apoio.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por mazierovictor@gmail.com
      Boa tarde galera!
      Preciso de uma ajuda, tenho um código que está listando os arquivos dentro de determinada pasta, e linkando para download, funcionando tudo certo, porém, eu precisaria que esse código lista-se somente arquivos com o formato .pdf o código é esse:
       
      <?php $diretorio = getcwd(); // pega o endereco do diretorio $ponteiro = opendir($diretorio); // ponteiro que ira percorrer a pasta while ($nome_itens = readdir($ponteiro)) { // monta o vetor com os itens da pasta $itens[] = $nome_itens; } sort($itens); // ordena o vetor de itens foreach ($itens as $listar) { //percorre o vetor para fazer a separacao entre arquivos e pastas if ($listar!=".php" && $listar!=".."){ // retira os itens "./" e "../" para que retorne apenas pastas e arquivos if (is_dir($listar)) { // checa se é uma pasta $pastas[]=$listar; // caso VERDADEIRO adiciona o item ao vetor de pastas } else{ $arquivos[]=$listar;// caso FALSO adiciona o item ao vetor de arquivos } } } $exte_p = array("pdf","PDF"); //foreach($pastas as $listar){// lista as pastas //print "<a href='$listar'><img border=0 src='index_pasta.png'>$listar</a><br>";} // foreach($arquivos as $listar){// lista os arquivos print "<a href='$listar'>$listar</a><br>"; } ?> Agradeço imensamente desde já!
    • Por Fabiana Gomes
      Pessoal, boa noite
       
      Preciso de um help!!
       
      Tenho a tabela ENDERECO e na coluna LOUGRADOURO (40) preciso diminuir alguns endereços para 30 caracteres.
      Basicamente preciso cortar a partir da casa 30.
       
      Alguem pode me ajudar?
    • Por Lucast
      Boa tarde galera,
       
      Estou tentando fazer a soma de duas colunas no SQL e queria que ela me retornasse o valor separado em uma coluna a parte, podem me ajudar?
       
      Isso é o que estou fazendo
       
      SELECT MONTH(workOrderDate) AS MES, (SUM(CASE WHEN WorkType = '02' AND workOrderDescription = 'preventiva' THEN 1.0 ELSE 0 END)) AS preventiva, (SUM(CASE WHEN workOrderDescription = 'CORRETIVA' THEN 1 ELSE 0 END)) AS corretivas FROM WorkOrder WHERE YEAR(workOrderDate) = 2018 AND lastUpdateData IS NOT NULL GROUP BY MONTH(workOrderDate);  
      Esse resultado me retorna esses valores:
       
      https://imgur.com/5XqbmFX
       
      Preciso que ele me retorne uma coluna ao lado informando a soma de ambas as colunas.
       
      Alguém consegue me ajudar?
       
       
    • Por lsantgo
      Estou a dois dias tentando resolver esse problema, se alguém puder me ajudar eu agradeço de mais. Possuo a seguinte consulta:
      Ela serve para que eu possa captar o próximo numero disponível para orçamento e já fazer um update adicionando 1 unidade a esse numero antes que que a aplicação quando usada por outro usuário capte o mesmo numero que outro.
      A consulta funciona perfeitamente, o banco usado é oracle 11g.
      Porém não consigo aplicar isso na linguagem php, pois a query não aceita 2 consultas. Já tentei usar cursores utilizando de oci_new_cursor, porém sem exito. Alguns trechos de código tentei adaptar de exemplos desse site PHP oci_new_cursor Examples Se alguém puder me ajudar por favor. Já nem sei mais o que tentar
      Seguem abaixo 2 exemplos de códigos (um com cursor e outro sem) :
       
      <?php include "config.php"; //arquivo de configuração //------------------------------------------------------------------------------------------------------// $query2 = "BEGIN SELECT proxnum FROM orcamento FOR UPDATE of proxnum; UPDATE orcamento SET proxnum = proxnum + 1; end;"; $s2 = oci_parse($c, $query2); if (!$s2) { $m2 = oci_error($c); trigger_error('Could not parse statement: ' . $m['message'], E_USER_ERROR); } //prepara para a execução $refcur = oci_new_cursor($c); $r2 = oci_execute($s2); if (!$r2){ $m2 = oci_error($s2); trigger_error('Could not execute statement: ' . $m['message'], E_USER_ERROR); }// executa a consulta oci_execute($refcur); ?> <?php include "config.php"; //arquivo de configuração //------------------------------------------------------------------------------------------------------// $query2 = " SELECT proxnum FROM orcamento FOR UPDATE of proxnum; UPDATE orcamento SET proxnum = proxnum + 1; "; $s2 = oci_parse($c, $query2); if (!$s2) { $m2 = oci_error($c); trigger_error('Could not parse statement: ' . $m['message'], E_USER_ERROR); } //prepara para a execução $r2 = oci_execute($s2); if (!$r2){ $m2 = oci_error($s2); trigger_error('Could not execute statement: ' . $m['message'], E_USER_ERROR); }// executa a consulta ?>  
    • Por eduardohaag
      Boa noite pessoal,
      Esbarrei em um novo problema com consultas no meu sistema.
       
      Tenho um formulário no sistema que deverá apresentar todos os materiais utilizados em uma determinada Venda e seus respectivos estoques obtidos através da soma das entradas e saidas do estoque.
      Para isso devo buscar os dados em 3 tabelas do banco de dados sendo elas VendasProdutos, Composicao,  Materiais e Estoque

       
      Eis que surge meu problema, como posso ter vários produtos na venda e alguns produtos usam os mesmos materiais, a consulta está retornando com os materiais duplicados, quando o que eu gostaria era que somasse de acordo com cada material.
       
      A query que estou usando para teste no acesso é a seguinte:
      SELECT Composicao.IdMaterial, materiais.descricao, Sum(Estoque.Quantidade) AS Estoque, [VendasProdutos]![Quantidade]*[Composicao]![Quantidade] AS TotalUtilizado FROM (VendasProdutos LEFT JOIN (materiais RIGHT JOIN Composicao ON materiais.ID = Composicao.IdMaterial) ON VendasProdutos.IdProduto = Composicao.IdProduto) LEFT JOIN Estoque ON materiais.ID = Estoque.IdMaterial GROUP BY Composicao.IdMaterial, materiais.descricao, [VendasProdutos]![Quantidade]*[Composicao]![Quantidade], VendasProdutos.IdVenda HAVING (((VendasProdutos.IdVenda)=1));  
      A consulta está retornando os dados dessa forma:

       
      E eu gostaria de que agrupasse por ex:
       
      ID                Descricao                Estoque               TotalUtilizado
      1                 Capa Agenda             34                             10
      2                 Miolo Agenda            27                              5
       
      Alguem Sabe como posso fazer isso?
      Desulpem pelo post gigante, mas não sabia como explicar melhor.
×

Informação importante

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