Array
(
)

Procedure com Case Faixa etaria de idades

Tânia Fiertz
   - 02 dez 2010

Olá Galera gente fina....
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
   - 02 dez 2010

#Código

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())
Estou tentando montar algo assim...mas nao sei  se esta correto ainda... Alguem???

Tânia Fiertz
   - 02 dez 2010


  Please!!! 

Emerson
   - 02 dez 2010

veja se isso te ajuda...

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.

Tânia Fiertz
   - 02 dez 2010

Então... Muito Interessante... 
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
#Código

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())

Tânia Fiertz
   - 02 dez 2010


 

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

Tânia Fiertz
   - 08 dez 2010

Solução....#Código

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