Usuário com melhor resposta
Script SQL

Pergunta
-
Olá,
Boa Tarde!
Estou com uns problemas no script abaixo, poderiam me auxiliar?Relatório:
Prezada conforme solicitado pela ANS necessitamos de um relatório que informe o número de pacientes que readmitimos após alta no prazo de 0-29 dias com o mesmo CID de internação. Esse dado necessita estar separado por mês (todos os meses de 2016)<o:p></o:p>
Fiz o Script abaixo, mais está dando alguns erros.
set dateformat dmy
DECLARE @DTINI DATETIME
DECLARE @DTFIM DATETIME
SET @DTINI = '01/01/2016'
SET @DTFIM = '01/02/2016'
SELECT
CONVENIO,
CID,
ANO,
SUM(CONTAGEM) AS CONTAGEM,
SUM(JANEIRO) AS JANEIRO,
SUM(FEVEREIRO) AS FEVEREIRO,
SUM(MARCO) AS MARCO,
SUM(ABRIL) AS ABRIL,
SUM(MAIO) AS MAIO,
SUM(JUNHO) AS JUNHO,
SUM(JULHO) AS JULHO,
SUM(AGOSTO) AS AGOSTO,
SUM(SETEMBRO) AS SETEMBRO,
SUM(OUTUBRO) AS OUTUBRO,
SUM(NOVEMBRO) AS NOVEMBRO,
SUM(DEZEMBRO) AS DEZEMBRO
FROM
(
SELECT
CONV_DS CONVENIO,
COUNT(EVE_ID) AS CONTAGEM,
CID_ID CID,
CAST ((select YEAR(@DTINI)) as char(4)) ANO,
Case When month(EVE_DT) = 1 then count(PAC_ID) else 0 end JANEIRO,
Case When month(EVE_DT) = 2 then count(PAC_ID) else 0 end FEVEREIRO,
Case When month(EVE_DT) = 3 then count(PAC_ID) else 0 end MARCO,
Case When month(EVE_DT) = 4 then count(PAC_ID) else 0 end ABRIL,
Case When month(EVE_DT) = 5 then count(PAC_ID) else 0 end MAIO,
Case When month(EVE_DT) = 6 then count(PAC_ID) else 0 end JUNHO,
Case When month(EVE_DT) = 7 then count(PAC_ID) else 0 end JULHO,
Case When month(EVE_DT) = 8 then count(PAC_ID) else 0 end AGOSTO,
Case When month(EVE_DT) = 9 then count(PAC_ID) else 0 end SETEMBRO,
Case When month(EVE_DT) = 10 then count(PAC_ID) else 0 end OUTUBRO,
Case When month(EVE_DT) = 11 then count(PAC_ID) else 0 end NOVEMBRO,
Case When month(EVE_DT) = 12 then count(PAC_ID) else 0 end DEZEMBRO
FROM
(SELECT DATEDIFF(DAY,DataUltimaAlta,DataInternacao)DiasDif,*
FROM
(SELECT (select MAX(EVE_DT) FROM EVENTO_INTERNACAO E2 WHERE E1.PAC_ID = E2.PAC_ID
AND
EIT_ID = 2
AND
E2.EVE_DT < E1.EVE_DT) DataUltimaAlta,
E1.EVE_DT DataInternacao,
E1.PCONV_ID,
E1.PAC_ID,
DIAG2.CID_ID,
CONV.CONV_DS,
COUNT(E1.EVE_ID),
E1.EVE_DT,
E1.EVE_ID
FROM
EVENTO_INTERNACAO E1
JOIN PLANO_CONVENIO PCONV ON PCONV.PCONV_ID = E1.PCONV_ID
JOIN CONVENIO CONV ON CONV.CONV_ID = PCONV.CONV_ID
JOIN DIAGNOSTICO DIAG2 ON DIAG2.EVE_ID = E1.EVE_ID AND DIAG2.DIAG_ITEM = 1
WHERE
EIT_ID = 1
AND
EVE_DT >= '01/01/2016'
AND
EVE_DT < '01/02/2016'
GROUP BY PCONV.PCONV_DS, CONV.CONV_DS, month (E1.EVE_DT), DIAG2.CID_ID, PAC_ID, E1.EVE_DT, E1.PCONV_ID, E1.EVE_ID
)CurInt
)DiasDif
where DiasDif < 30)Não reconhece o cursor DiasDif e o erro abaixo:
Msg 102, Level 15, State 1, Line 78
Sintaxe incorreta perto de ')'.
Aguardo.Obrigado.
- Editado Renan Kawamoto Fagundes sexta-feira, 21 de abril de 2017 18:56
Respostas
-
tente isso.
... FROM (SELECT DATEDIFF(DAY,DataUltimaAlta,DataInternacao) as DiferencaDias ,* FROM (SELECT (select MAX(EVE_DT) FROM EVENTO_INTERNACAO E2 WHERE E1.PAC_ID = E2.PAC_ID AND EIT_ID = 2 AND E2.EVE_DT < E1.EVE_DT) DataUltimaAlta, E1.EVE_DT DataInternacao, E1.PCONV_ID, E1.PAC_ID, DIAG2.CID_ID, CONV.CONV_DS, COUNT(E1.EVE_ID), E1.EVE_DT, E1.EVE_ID FROM EVENTO_INTERNACAO E1 JOIN PLANO_CONVENIO PCONV ON PCONV.PCONV_ID = E1.PCONV_ID JOIN CONVENIO CONV ON CONV.CONV_ID = PCONV.CONV_ID JOIN DIAGNOSTICO DIAG2 ON DIAG2.EVE_ID = E1.EVE_ID AND DIAG2.DIAG_ITEM = 1 WHERE EIT_ID = 1 AND EVE_DT >= '01/01/2016' AND EVE_DT < '01/02/2016' GROUP BY PCONV.PCONV_DS, CONV.CONV_DS, month (E1.EVE_DT), DIAG2.CID_ID, PAC_ID, E1.EVE_DT, E1.PCONV_ID, E1.EVE_ID )CurInt )DiasDif where DiasDif.DiferencaDias < 30)
Nao consigo rodar seu sql, mas me parece que esse é o problema
- Marcado como Resposta Robson William Silva terça-feira, 25 de abril de 2017 12:05
Todas as Respostas
-
tente isso.
... FROM (SELECT DATEDIFF(DAY,DataUltimaAlta,DataInternacao) as DiferencaDias ,* FROM (SELECT (select MAX(EVE_DT) FROM EVENTO_INTERNACAO E2 WHERE E1.PAC_ID = E2.PAC_ID AND EIT_ID = 2 AND E2.EVE_DT < E1.EVE_DT) DataUltimaAlta, E1.EVE_DT DataInternacao, E1.PCONV_ID, E1.PAC_ID, DIAG2.CID_ID, CONV.CONV_DS, COUNT(E1.EVE_ID), E1.EVE_DT, E1.EVE_ID FROM EVENTO_INTERNACAO E1 JOIN PLANO_CONVENIO PCONV ON PCONV.PCONV_ID = E1.PCONV_ID JOIN CONVENIO CONV ON CONV.CONV_ID = PCONV.CONV_ID JOIN DIAGNOSTICO DIAG2 ON DIAG2.EVE_ID = E1.EVE_ID AND DIAG2.DIAG_ITEM = 1 WHERE EIT_ID = 1 AND EVE_DT >= '01/01/2016' AND EVE_DT < '01/02/2016' GROUP BY PCONV.PCONV_DS, CONV.CONV_DS, month (E1.EVE_DT), DIAG2.CID_ID, PAC_ID, E1.EVE_DT, E1.PCONV_ID, E1.EVE_ID )CurInt )DiasDif where DiasDif.DiferencaDias < 30)
Nao consigo rodar seu sql, mas me parece que esse é o problema
- Marcado como Resposta Robson William Silva terça-feira, 25 de abril de 2017 12:05
-
-
-
Renan, algumas dúvidas:
- na internação é gravada uma linha na tabela EVENTO_INTERNACAO e na respectiva alta é gravada outra linha?
- se a resposta da pergunta 1 for sim, como detectar qual é a linha da internação e qual é a linha de alta?
EIT_ID?
- existe alguma coluna nessa tabela que relacione diretamente a internação com a respectiva alta?
EVE_ID?
- o CID no momento da alta pode ser diferente do CID no momento da internação?
José Diz Belo Horizonte, MG - Brasil
José,
Ótimas perguntas, pois se realmente existir uma tabela que guarde os dados da nova internação ficará mais fácil fazer o relacionamento dos dados. Eu acredito que o código do CID poderá mudar em caso de uma nova internação.
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]