Procedure com Case Faixa etaria de idades
02/12/2010
0
Bom estou eu a cá para trazer minha duvida
preciso fazer um relatorio com Cross table no crystal report... para isso preciso montar uma procedure em que eu vou ter que passar determinados parametros
bom é um relatorio para um hospital em que o gestor irá selecionar faixa etarias de idades onde eu irei contar quantos atendimentos foram executados em um determinado periodo
exemplo
0 a 28 dias ----> Quantos atendimentos de determinada prescrição medica29 a 1 ano ----> qnds atend1 a 5 anos ----> //5 a 11 anos--->11 a 30 anos--->
as faixas o usuario ira digitar... e eu vou ter que ver em q faixa ele se enquada e depois somar
fazendo no sql depois creio eu q no report ficara mais facil de mexer...
nem sei como começar
Muito Obrigada desde já
Tânia Fiertz
Posts
02/12/2010
Tânia Fiertz
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo].[teste] @dtini AS VARCHAR(10),@dtFim AS VARCHAR(10) AS SELECT Cid.cdCID, cid.dscid,DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE()) AS Idade, COUNT(pac.nmPaciente) as nrOcorrencias, CASE WHEN DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE()) >='0 dia(s)' and DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE())<='28 dia(s)' THEN COUNT(pac.nmPaciente) WHEN DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE()) >='29 dia(s)' and DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE())<='11 mes(es) e 29 dia(s)' THEN COUNT(pac.nmPaciente) WHEN DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE()) >='1 Ano(s) 0 mes(es) e 1 dia(s)' and DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE())<='5 Ano(s) 11 mes(es) e 29 dia(s)' THEN COUNT(pac.nmPaciente) WHEN DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE()) >='5 Ano(s) 11 mes(es) e 29 dia(s)' and DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE())<='11 Ano(s)' THEN COUNT(pac.nmPaciente) WHEN DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE()) >='11 Anos ' and DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE())<='30 Anos' THEN COUNT(pac.nmPaciente) END FROM dbo.tbCliPacientesObservacaoCID AS OBSCIDINNER JOIN dbo.tbSusCID AS Cid ON OBSCID.IdCid = Cid.IdCIDINNER JOIN dbo.tbCliPacientesObeservacao AS obs ON obs.IdObservacao = obscid.IdObservacao INNER JOIN dbo.tbGerPacientes AS pac ON obs.IdPaciente = pac.IdPaciente WHERE dtDiagnostico >= @dtini + ' 00:00:00' AND dtDiagnostico <= @dtFim + ' 23:59:59'GROUP BY cdCID , dsCID ,DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE())
02/12/2010
Emerson Nascimento
SELECT
(CASE
WHEN (GETDATE() - PAC.dtnascimento) <= 28 THEN 'GRUPO 1 -> ATE 28 DIAS'
WHEN (GETDATE() - PAC.dtnascimento) <= 365 THEN 'GRUPO 2 -> 29 DIAS A 1 ANO'
WHEN (GETDATE() - PAC.dtnascimento) <= 1825 THEN 'GRUPO 3 -> +1 ANO A 5 ANOS'
WHEN (GETDATE() - PAC.dtnascimento) <= 4015 THEN 'GRUPO 4 -> +5 ANOS A 11 ANOS'
WHEN (GETDATE() - PAC.dtnascimento) <= 10950 THEN 'GRUPO 5 -> +11 ANOS A 30 ANOS'
WHEN (GETDATE() - PAC.dtnascimento) > 10950 THEN 'GRUPO 6 -> +30 ANOS'
END) AS GRUPO,
Cid.cdCID, cid.dsCID,
COUNT(*) ATENDIMENTOS
FROM
dbo.tbCliPacientesObservacaoCID AS OBSCID
INNER JOIN
dbo.tbSusCID AS Cid ON OBSCID.IdCid = Cid.IdCID
INNER JOIN
dbo.tbCliPacientesObeservacao AS obs ON obs.IdObservacao = obscid.IdObservacao
INNER JOIN
dbo.tbGerPacientes AS pac ON obs.IdPaciente = pac.IdPaciente
WHERE
PAC.dtDiagnostico >= @dtini AND PAC.dtDiagnostico <= @dtFim
GROUP BY
(CASE
WHEN (GETDATE() - PAC.dtnascimento) <= 28 THEN 'GRUPO 1 -> ATE 28 DIAS'
WHEN (GETDATE() - PAC.dtnascimento) <= 365 THEN 'GRUPO 2 -> 29 DIAS A 1 ANO'
WHEN (GETDATE() - PAC.dtnascimento) <= 1825 THEN 'GRUPO 3 -> +1 ANO A 5 ANOS'
WHEN (GETDATE() - PAC.dtnascimento) <= 4015 THEN 'GRUPO 4 -> +5 ANOS A 11 ANOS'
WHEN (GETDATE() - PAC.dtnascimento) <= 10950 THEN 'GRUPO 5 -> +11 ANOS A 30 ANOS'
WHEN (GETDATE() - PAC.dtnascimento) > 10950 THEN 'GRUPO 6 -> +30 ANOS'
END),
Cid.cdCID, cid.dscid
suponho todas as tabelas envolvidas e todos os seus relacionamentos estejam todos corretos.
02/12/2010
Tânia Fiertz
vou testar mas o problema é o seguinte
o select que eu fiz estou usando uma função que eu criei que retorna a idade do cara cadastrado pq em hospital eles precisam ate a idade de 7 anos tipo...
3 anos 2 meses e 5 dias mas eu só coloquei no select pq eu nao sei como irei passar por parametro...esse getanomesdia retor string...
bom... isso nao vem ao caso
mas o meu grannnnde problema vai ser...meu gerente quer que na tela eu tenha uma checkbox para a opçao 0 a 28 diasoutra para 29 dias a (11 meses e 29 dias)nas opções 1 à 5 anos o usuario tera que informar a idade desejadana opção 5 à 11 tb, e 11 à 30 o usuario ira digitar...
o dilema é como que eu irei passar esses parametros pra Procedure que irei criar...tava tentado tb algo assim
USE [GiiGSaudeDB]GO/****** Object: StoredProcedure [dbo].[teste] Script Date: 12/02/2010 13:49:32 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo].[teste] @dtini AS VARCHAR(10),@dtFim AS VARCHAR(10), @faixa1 as varchar(50),@faixa2 as varchar(50),@faixa3 as varchar(50),@faixa4 as varchar(50),@faixa5 as varchar(50)AS SELECT Cid.cdCID, cid.dscid,DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE()) AS Idade, COUNT(pac.nmPaciente) as nrOcorrencias, CASE WHEN @faixa1 >='0 dia(s)' and @faixa1<='28 dia(s)' THEN COUNT(pac.nmPaciente) WHEN @faixa2 >='29 dia(s)' and @faixa2 <='11 mes(es) e 29 dia(s)' THEN COUNT(pac.nmPaciente) WHEN @faixa3 >='1 Ano(s) 0 mes(es) e 0 dia(s)' and @faixa3 <='5 Ano(s) 11 mes(es) e 29 dia(s)' THEN COUNT(pac.nmPaciente) WHEN @faixa4 >='5 Ano(s) 11 mes(es) e 29 dia(s)' and @faixa4 <='11 Ano(s)' THEN COUNT(pac.nmPaciente) WHEN @faixa5 >='11 Anos ' and @faixa5<='30 Anos' THEN COUNT(pac.nmPaciente) END FROM dbo.tbCliPacientesObservacaoCID AS OBSCIDINNER JOIN dbo.tbSusCID AS Cid ON OBSCID.IdCid = Cid.IdCIDINNER JOIN dbo.tbCliPacientesObeservacao AS obs ON obs.IdObservacao = obscid.IdObservacao INNER JOIN dbo.tbGerPacientes AS pac ON obs.IdPaciente = pac.IdPaciente WHERE dtDiagnostico >= @dtini + ' 00:00:00' AND dtDiagnostico <= @dtFim + ' 23:59:59'GROUP BY cdCID , dsCID ,DBO.GetIdadeAnoMesDia(PAC.dtnascimento,GETDATE())
02/12/2010
Tânia Fiertz
o resultado da idade no banco é mais ou menos assim...ai nao sei como ou ver no meu banco qnts atendimentos com determinada prescrição medica daquela faixa etaria tem... pra mim passar pro cross table
08/12/2010
Tânia Fiertz
ALTER procedure [dbo].[CrossTable]@p1 as int,@p2 as int,@p3 as intas CREATE TABLE #TMP_Temporaria( idTb int identity, cdCID varchar(50), dscid varchar(200), Idade int, tipoIdade varchar(50) )INSERT INTO #TMP_Temporaria (cdCID, dscid, Idade, tipoIdade)SELECT Cid.cdCID, cid.dscid, DBO.GetIdade(PAC.dtnascimento,GETDATE()) AS Idade,'' as margemIdade FROM dbo.tbCliPacientesObservacaoCID AS OBSCIDINNER JOIN dbo.tbSusCID AS Cid ON OBSCID.IdCid = Cid.IdCIDINNER JOIN dbo.tbCliPacientesObeservacao AS obs ON obs.IdObservacao = obscid.IdObservacao INNER JOIN dbo.tbGerPacientes AS pac ON obs.IdPaciente = pac.IdPacientewhere cid.cdcid = 'A030' update #TMP_Temporaria set #TMP_Temporaria.tipoIdade = CASE WHEN tp.Idade <= @p1 THEN 'ate 5 anos'--+ CONVERT(VARCHAR(2),@p1 ) +' anos' WHEN tp.Idade >= @p1 AND tp.Idade < @p2 THEN 'ate 30 anos '--+ CONVERT(VARCHAR(2),@p2) +' anos' WHEN tp.Idade >= @p3 THEN 'mais de 30 anos'--+ CONVERT(VARCHAR(2),@p3 ) END FROM #TMP_Temporaria as tp select * from #TMP_Temporariadrop table #TMP_Temporaria
Clique aqui para fazer login e interagir na Comunidade :)