Ir para conteúdo

Arquivado

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

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

  • Conteúdo Similar

    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por FabianoSouza
      Tenho uma function que precisa receber 02 argumentos.
      Ela funciona se eu aplicar num select qualquer. Mas se eu aplicar num select dinâmico, ocorre erro.
      Veja trecho do meu select.
      ... SET @sql = @sql +', dbo.retornaIco_ItemBloq((SELECT COUNT(*) FROM dbo.tab AS TT2 WHERE TT2.codCategTreina = CTT.id),'+@title+') AS ''resp''' ... No caso, o primeiro argumento da function dbo.retornaIco_ItemBloq é um SELECT COUNT.
      O segundo argumento é uma variável (que está devidamente declarada e definida).
       
      O erro ocorre porque ao executar (chamando EXEC(@sql) ), o SQL entende que o segundo argumento é uma coluna da consulta principal, pois existe uma vírgula antes da variável @title (que é o segundo argumento da function).
      Repito. Se eu aplicar essa function num select normal, funciona normalmente. Porém, preciso que funcione num SQL dinâmico porque é esse é o padrão que estou adotando para o sistema todo.
       
      A function dbo.retornaIco_ItemBloq faz o seguinte:
      1) Recebe o valor do COUNT e da variável @title
      2) Se o COUNT for maior que  Zero, cria uma tag HTML (uma SPAN), define sua title com o valor da variável @title e passa para uma variável
      3) Retorna o HTML que será exibido no resultado da consulta principal
      É super simples.
       
      Há outra forma de chamar a function?
    • Por mr22robot
      Ola caros amigos. 
      Estou com uma dúvida aqui que embora nao tenho achado ainda uma resposta, acredito que haja.
      Estou estudando a tão sonhada linguagem de programação asp.net core mvc. Linguagem essa que demorei 5 anos pra iniciar os estudos rsrs.
      Mas estou agarrado em uma situação. 
      Estou usando como base de dados nos meus estudos um banco Oracle. Que já tem algumas informações nele. Utilizei o SCAFFOLD para criar as classes e o contexto baseado no banco e tabelas existentes. 
      Porem agora na fase das consultas, estou perdido em como utilizar o IN que eu utilizo no oracle; no LINQ.
      Ex: 
      SELECT CODPROD,DESCRICAO FROM PRODUTO WHERE CODPROD IN(1,2,3,4,5,6) Como eu utilizo esse filtro com uma restrição de códigos de produtos? no caso o where codprod in(1,2,3,4,5,6) ?.
      Desde já obrigado pela ajuda.
    • Por Sapinn
      Olá a todos existe alguma maneira de trazer todos os dados de uma tabela menos o maior valor?
    • Por Wandersonwfs
      Bom dia Pessoal,
       
      Estou com um problema para finalizar uma consulta onde, quando executado a consulta  e não encontrado nenhuma informação no período solicitado, tenho que trazer pelo menos o nome da conta.
       
      Consulta,
       
      WITH TMPESTONO (
          NOME_IMPOSTO
          ,MES
          ,VALOR
          )
      AS (
          SELECT 'ESTORNO SOBRE GREEN VILLE' AS NOME_IMPOSTO
              ,'F_' + SZN.ZN_ITEM AS FILFOR
              ,SUM((SZN.ZN_PRV * SZN.ZN_PRCAPL) / 100) AS TOTAL
          FROM SZN010 SZN
          WHERE SZN.D_E_L_E_T_ = ' '
              AND SZN.ZN_ITEM IN (
                  '01'
                  ,'16'
                  ,'30'
                  ,'40'
                  ,'46'
                  ,'51'
                  ,'52'
                  ,'60'
                  ,'70'
                  ,'72'
                  ,'73'
                  ,'80'
                  )
              AND SZN.ZN_DATA BETWEEN '20220701'
                  AND '20220731'
              AND SZN.ZN_DESC = ('GRENVILLE')
          GROUP BY SZN.ZN_DESC
              ,SZN.ZN_ITEM
          )
      SELECT *
      FROM (
          SELECT NOME_IMPOSTO
              ,MES
              ,VALOR
          FROM TMPESTONO
          ) AS PivotData
      PIVOT(SUM(VALOR) FOR MES IN (
                  [F_16]
                  ,[F_30]
                  ,[F_40]
                  ,[F_46]
                  ,[F_51]
                  ,[F_52]
                  ,[F_60]
                  ,[F_70]
                  ,[F_72]
                  ,[F_73]
                  ,[TOTAL]
                  )) AS PivotTable2
      ORDER BY 1
       
×

Informação importante

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