Ajuda em Código SQL ORACLE

20/04/2020

0

((select sum(a.QT_HORA_REAL)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA C
where ds_etapa='225'
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia)*100)/(select decode(sum(r.qt_resultado),0,100,1,20,2,40,3,60,4,80,5,100)
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
) - (select sum(a.QT_HORA_PREV)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA c
where a.ds_etapa='225'
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia)

Preciso pegar o valor total disso, das etapas 163 a 225, já testei com a.ds_etapa between 163 and 225, acho que o decode n tá deixando somar direito, tirei ele e fiz com case, só que ai soma tudo errado
Leonardo Horning

Leonardo Horning

Responder

Posts

22/04/2020

Emerson Nascimento

vamos por partes:
aqui você tem o total de horas previstas e o total de horas realizadas de cada etapa entre '163' e '225' (alterei os alias das tabelas pra meu melhor entendimento: e-etapa, c-cronograma e p-projeto):
select
	e.ds_etapa,
	sum(e.QT_HORA_PREV) HPREV,
	sum(e.QT_HORA_REAL) HREAL
from
	PROJ_CRON_ETAPA e
INNER JOIN
	PROJ_CRONOGRAMA c ON c.nr_sequencia = e.nr_seq_cronograma
INNER JOIN
	PROJ_PROJETO p ON p.nr_sequencia = c.nr_seq_proj
where
	e.ds_etapa between '163' and '225'
	and p.nr_sequencia = :nr_sequencia
group by
	e.ds_etapa

agora duas perguntas:
- porque a utilização da tabela PROJ_PROJETO? ela aparentemente não serve pra nada na instrução acima. poderia ser:
select
	e.ds_etapa,
	sum(e.QT_HORA_PREV) HPREV,
	sum(e.QT_HORA_REAL) HREAL
from
	PROJ_CRON_ETAPA e
INNER JOIN
	PROJ_CRONOGRAMA c ON c.nr_sequencia = e.nr_seq_cronograma
where
	e.ds_etapa between '163' and '225'
	and c.nr_seq_proj = :nr_sequencia
group by
	e.ds_etapa

- também não entendi uma coisa na parte da divisão. você fez referência à ap.nr_sequencia, mas o que é "ap." ?
Responder

22/04/2020

Leonardo Horning

Na verdade eu to tentando somar 3 sub-selects nesse código, esse AP é de uma tabela med_avaliacao_paciente, eu esqueci de adicionar ela,



and b.nr_sequencia=:nr_sequencia)*100)/(select decode(sum(r.qt_resultado),0,100,1,20,2,40,3,60,4,80,5,100)
from med_avaliacao_result r


ela entra depois desse cara aqui.. , eu uso ela pra filtrar a pessoa fisíca depois

No Código eu preciso pegar o primeiro sub-select, multiplicar por 100, depois dividir pelo segundo sub-select, e depois subtrair pelo terceiro sub-select, e depois somar da etapa 163 á 225.
a tabela PROJ_projeto, é usada para filtrar o NR_sequencia no relatório.
Obrigado pela resposta!!

Responder

22/04/2020

Emerson Nascimento

você não pode publicar a instrução completa?
Responder

22/04/2020

Leonardo Horning

select ''Imunização'' A,
(select decode(r.qt_resultado,0,''Não'',''Sim'')
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
and r.nr_seq_item=960) B,
(select decode(r.qt_resultado,0,''Não'',''Sim'')
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
and r.nr_seq_item=958) C,
(select decode(r.qt_resultado,0,''Não'',''Sim'')
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
and r.nr_seq_item=957) D,
(select decode(r.qt_resultado,0,''Não'',''Sim'')
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
and r.nr_seq_item=959) E,
(select decode(r.qt_resultado,0,''Não'',''Sim'')
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
and r.nr_seq_item=961) F,
(select decode(sum(r.qt_resultado),0,0,1,20,2,40,3,60,4,80,5,100)
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
) G,
(select sum(a.QT_HORA_PREV)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA c
where a.ds_etapa =''214''
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia) H,
(select sum(a.QT_HORA_REAL)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_Cronograma c
where a.ds_etapa =''214''
and c.nr_sequencia =a.nr_seq_cronograma
and c.nr_seq_proj =b.nr_sequencia
and b.nr_sequencia=:nr_sequencia) I,
(select decode(sum(r.qt_resultado),0,1,1,20,2,40,3,60,4,80,5,100)
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
) J,
((select sum(a.QT_HORA_REAL)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA C
where ds_etapa=''214''
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia)*100)/(select decode(sum(r.qt_resultado),0,100,1,20,2,40,3,60,4,80,5,100)
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
) - (select sum(a.QT_HORA_PREV)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA c
where a.ds_etapa=''214''
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia) K,
(select sum(a.QT_HORA_PREV)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA c
where a.ds_etapa=''214''
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia)+((((select sum(QT_HORA_REAL)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA c
where a.ds_etapa=''214''
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia)*100)/(select decode(sum(r.qt_resultado),0,100,1,20,2,40,3,60,4,80,5,100)
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
))-(select sum(a.QT_HORA_PREV)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA C
where a.ds_etapa=''214''
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia)) L,
case when
(select sum(a.QT_HORA_PREV)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA C
where a.ds_etapa=''214''
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj =b.nr_sequencia
and b.nr_sequencia=:nr_sequencia)+((((select sum(QT_HORA_REAL)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA C
where a.ds_etapa =''214''
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia)*100)/(select decode(sum(r.qt_resultado),0,100,1,20,2,40,3,60,4,80,5,100)
from med_avaliacao_result r
where r.nr_seq_avaliacao=ap.nr_sequencia
))-(select sum(QT_HORA_PREV)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA C
where a.ds_etapa=''214''
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia))>(select sum(QT_HORA_PREV)
from PROJ_CRON_ETAPA a,
PROJ_PROJETO b,
PROJ_CRONOGRAMA c
where a.ds_etapa=''214''
and c.nr_sequencia=a.nr_seq_cronograma
and c.nr_seq_proj=b.nr_sequencia
and b.nr_sequencia=:nr_sequencia)THEN ''Neg''
ELSE ''Pos''
END as M
from med_avaliacao_paciente ap
where (ap.cd_pessoa_fisica=:cd_pessoa_fisica or cd_pessoa_fisica=0)
and ap.nr_seq_tipo_avaliacao=214



esse é o código da etapa 214, tem um código para cada etapa, são todos iguais, só muda a ds.etapa e o nr_seq_item
Responder

22/04/2020

Emerson Nascimento

opa!
então... essa query está muito 'verbosa', com muita repetição de comandos.
eu não tenho ORACLE instalado, então se der algum problema, vamos ajustando....
veja se esta alteração traz os valores corretos para a etapa 214:
select
	a.ds_etapa,
	c.nr_seq_proj,

	'Imunização' A,
	case when coalesce(apseq.qtB,0) = 0 then 'Não' else 'Sim' end B,
	case when coalesce(apseq.qtC,0) = 0 then 'Não' else 'Sim' end C,
	case when coalesce(apseq.qtD,0) = 0 then 'Não' else 'Sim' end D,
	case when coalesce(apseq.qtE,0) = 0 then 'Não' else 'Sim' end E,
	case when coalesce(apseq.qtF,0) = 0 then 'Não' else 'Sim' end F,

	decode(coalesce(apseq.totresultado,0),0,0,1,20,2,40,3,60,4,80,5,100) G,

	sum(a.QT_HORA_PREV) H,
	sum(a.QT_HORA_REAL) I,

	decode(coalesce(apseq.totresultado,0),0,1,1,20,2,40,3,60,4,80,5,100) J,

	(sum(a.QT_HORA_REAL)*100) /	coalesce(apseq.DivHr,100) -	sum(a.QT_HORA_PREV) K,

	sum(a.QT_HORA_PREV) + (((sum(a.QT_HORA_REAL)*100)/coalesce(apseq.DivHr,100))-sum(a.QT_HORA_PREV)) L,

	case when sum(a.QT_HORA_PREV)+(((sum(a.QT_HORA_REAL)*100)/coalesce(apseq.DivHr,100))-sum(a.QT_HORA_PREV)) > sum(a.QT_HORA_PREV)
		then 'Neg'
		else 'Pos'
	end M
from
	PROJ_CRON_ETAPA a
inner join
	PROJ_CRONOGRAMA c on c.nr_sequencia = a.nr_seq_cronograma
left join
	(select
		ap.nr_sequencia,
		ap.nr_seq_tipo_avaliacao,
		sum(case when coalesce(r.nr_seq_item,0)=960 then r.qt_resultado else 0 end) qtB,
		sum(case when coalesce(r.nr_seq_item,0)=958 then r.qt_resultado else 0 end) qtC,
		sum(case when coalesce(r.nr_seq_item,0)=957 then r.qt_resultado else 0 end) qtD,
		sum(case when coalesce(r.nr_seq_item,0)=959 then r.qt_resultado else 0 end) qtE,
		sum(case when coalesce(r.nr_seq_item,0)=961 then r.qt_resultado else 0 end) qtF,
		sum(r.qt_resultado) totresultado,
		decode(sum(r.qt_resultado),0,100,1,20,2,40,3,60,4,80,5,100) DivHr
	from
		med_avaliacao_paciente ap
	left join
		med_avaliacao_result r on r.nr_seq_avaliacao = ap.nr_sequencia
	where
		(ap.cd_pessoa_fisica = :cd_pessoa_fisica or ap.cd_pessoa_fisica = 0)
		and ap.nr_seq_tipo_avaliacao = 214
	group by
		ap.nr_sequencia,
		ap.nr_seq_tipo_avaliacao
	) apseq on apseq.nr_sequencia = c.nr_seq_proj and apseq.nr_seq_tipo_avaliacao = a.ds_etapa
where
	a.ds_etapa = '214'
	and c.nr_seq_proj = :nr_sequencia
group by
	a.ds_etapa,
	c.nr_seq_proj


Responder

22/04/2020

Leonardo Horning

https://ibb.co/4Nv25K0


De uma olhada na imagem desse link, pra você entender melhor, então, cada módulo é uma banda, e cada banda, tem o código SQL, que é esse código enorme que eu mandei, o Cadastros Básicos é a etapa 163, Recepção é a etapa 164, Estoque é a etapa 165, e assim por diante..
Os dados estão puxando certinhos, a unica coisa que eu não to conseguindo fazer, é criar uma nova banda chamada de "Total", pra somar o campo "Tendência" de todos os módulos, quero que apareça a soma de todos eles embaixo, entendeu???

PS: o SQL da imunização, que tá ali emcima, é da etapa 214, todos os sqls de todas as etapas são idênticos, só muda o nome, o ds_etapa
o nr_seq_tipo_avaliacao e o nr_seq_item

Grato novamente pela força que tu tá dando!!!!
Responder

23/04/2020

Emerson Nascimento

entendi o que você quis fazer. é que estou tentando fazer de uma forma que aquela única query dê o resultado geral do relatório; uma única query para gerar todas aquelas linhas.
Responder

24/04/2020

Leonardo Horning

Entendi, vamos fazer isso então, testei o seu código para a etapa 214, deu erro falando que não é uma expressão GROUP BY
Responder

24/04/2020

Emerson Nascimento

tem como você passar os DDLs das tabelas envolvidas. não preciso dos dados, somente criar as tabelas.
Responder

24/04/2020

Emerson Nascimento

tente assim:
só troquei o decode por case porque uso SQLServer e nele a função decode não existe.
select
    a.ds_etapa,
    c.nr_seq_proj,
 
    'Imunização' A,
    case when coalesce(max(apseq.qtB),0) = 0 then 'Não' else 'Sim' end B,
    case when coalesce(max(apseq.qtC),0) = 0 then 'Não' else 'Sim' end C,
    case when coalesce(max(apseq.qtD),0) = 0 then 'Não' else 'Sim' end D,
    case when coalesce(max(apseq.qtE),0) = 0 then 'Não' else 'Sim' end E,
    case when coalesce(max(apseq.qtF),0) = 0 then 'Não' else 'Sim' end F,
 
    (case coalesce(max(apseq.totresultado),0)
		when 0 then 0
		when 1 then 20
		when 2 then 40
		when 3 then 60
		when 4 then 80
		when 5 then 100
	end) G,
 
    sum(a.QT_HORA_PREV) H,
    sum(a.QT_HORA_REAL) I,
 
    (case coalesce(max(apseq.totresultado),0)
		when 0 then 1
		when 1 then 20
		when 2 then 40
		when 3 then 60
		when 4 then 80
		when 5 then 100
	end) J,
 
    (sum(a.QT_HORA_REAL)*100) / coalesce(max(apseq.DivHr),100) - sum(a.QT_HORA_PREV) K,
 
    sum(a.QT_HORA_PREV) + (((sum(a.QT_HORA_REAL)*100)/coalesce(max(apseq.DivHr),100))-sum(a.QT_HORA_PREV)) L,
 
    case when sum(a.QT_HORA_PREV)+(((sum(a.QT_HORA_REAL)*100)/coalesce(max(apseq.DivHr),100))-sum(a.QT_HORA_PREV)) > sum(a.QT_HORA_PREV)
        then 'Neg'
        else 'Pos'
    end M
from
    PROJ_CRON_ETAPA a
inner join
    PROJ_CRONOGRAMA c on c.nr_sequencia = a.nr_seq_cronograma
left join
    (select
        ap.nr_sequencia,
        ap.nr_seq_tipo_avaliacao,
        sum(case when coalesce(r.nr_seq_item,0)=960 then r.qt_resultado else 0 end) qtB,
        sum(case when coalesce(r.nr_seq_item,0)=958 then r.qt_resultado else 0 end) qtC,
        sum(case when coalesce(r.nr_seq_item,0)=957 then r.qt_resultado else 0 end) qtD,
        sum(case when coalesce(r.nr_seq_item,0)=959 then r.qt_resultado else 0 end) qtE,
        sum(case when coalesce(r.nr_seq_item,0)=961 then r.qt_resultado else 0 end) qtF,
        sum(r.qt_resultado) totresultado,
        (case coalesce(sum(r.qt_resultado),0)
			when 0 then 100
			when 1 then 20
			when 2 then 40
			when 3 then 60
			when 4 then 80
			when 5 then 100
		end) DivHr
    from
        med_avaliacao_paciente ap
    left join
        med_avaliacao_result r on r.nr_seq_avaliacao = ap.nr_sequencia
    where
        (ap.cd_pessoa_fisica = 1 or ap.cd_pessoa_fisica = 0)
        and ap.nr_seq_tipo_avaliacao = 214
    group by
        ap.nr_sequencia,
        ap.nr_seq_tipo_avaliacao
    ) apseq on apseq.nr_sequencia = c.nr_seq_proj and apseq.nr_seq_tipo_avaliacao = a.ds_etapa
where
    a.ds_etapa = '214'
    and c.nr_seq_proj = 5
group by
    a.ds_etapa,
    c.nr_seq_proj
Responder

24/04/2020

Leonardo Horning

tente assim:
só troquei o decode por case porque uso SQLServer e nele a função decode não existe.
select
    a.ds_etapa,
    c.nr_seq_proj,
 
    'Imunização' A,
    case when coalesce(max(apseq.qtB),0) = 0 then 'Não' else 'Sim' end B,
    case when coalesce(max(apseq.qtC),0) = 0 then 'Não' else 'Sim' end C,
    case when coalesce(max(apseq.qtD),0) = 0 then 'Não' else 'Sim' end D,
    case when coalesce(max(apseq.qtE),0) = 0 then 'Não' else 'Sim' end E,
    case when coalesce(max(apseq.qtF),0) = 0 then 'Não' else 'Sim' end F,
 
    (case coalesce(max(apseq.totresultado),0)
		when 0 then 0
		when 1 then 20
		when 2 then 40
		when 3 then 60
		when 4 then 80
		when 5 then 100
	end) G,
 
    sum(a.QT_HORA_PREV) H,
    sum(a.QT_HORA_REAL) I,
 
    (case coalesce(max(apseq.totresultado),0)
		when 0 then 1
		when 1 then 20
		when 2 then 40
		when 3 then 60
		when 4 then 80
		when 5 then 100
	end) J,
 
    (sum(a.QT_HORA_REAL)*100) / coalesce(max(apseq.DivHr),100) - sum(a.QT_HORA_PREV) K,
 
    sum(a.QT_HORA_PREV) + (((sum(a.QT_HORA_REAL)*100)/coalesce(max(apseq.DivHr),100))-sum(a.QT_HORA_PREV)) L,
 
    case when sum(a.QT_HORA_PREV)+(((sum(a.QT_HORA_REAL)*100)/coalesce(max(apseq.DivHr),100))-sum(a.QT_HORA_PREV)) > sum(a.QT_HORA_PREV)
        then 'Neg'
        else 'Pos'
    end M
from
    PROJ_CRON_ETAPA a
inner join
    PROJ_CRONOGRAMA c on c.nr_sequencia = a.nr_seq_cronograma
left join
    (select
        ap.nr_sequencia,
        ap.nr_seq_tipo_avaliacao,
        sum(case when coalesce(r.nr_seq_item,0)=960 then r.qt_resultado else 0 end) qtB,
        sum(case when coalesce(r.nr_seq_item,0)=958 then r.qt_resultado else 0 end) qtC,
        sum(case when coalesce(r.nr_seq_item,0)=957 then r.qt_resultado else 0 end) qtD,
        sum(case when coalesce(r.nr_seq_item,0)=959 then r.qt_resultado else 0 end) qtE,
        sum(case when coalesce(r.nr_seq_item,0)=961 then r.qt_resultado else 0 end) qtF,
        sum(r.qt_resultado) totresultado,
        (case coalesce(sum(r.qt_resultado),0)
			when 0 then 100
			when 1 then 20
			when 2 then 40
			when 3 then 60
			when 4 then 80
			when 5 then 100
		end) DivHr
    from
        med_avaliacao_paciente ap
    left join
        med_avaliacao_result r on r.nr_seq_avaliacao = ap.nr_sequencia
    where
        (ap.cd_pessoa_fisica = 1 or ap.cd_pessoa_fisica = 0)
        and ap.nr_seq_tipo_avaliacao = 214
    group by
        ap.nr_sequencia,
        ap.nr_seq_tipo_avaliacao
    ) apseq on apseq.nr_sequencia = c.nr_seq_proj and apseq.nr_seq_tipo_avaliacao = a.ds_etapa
where
    a.ds_etapa = '214'
    and c.nr_seq_proj = 5
group by
    a.ds_etapa,
    c.nr_seq_proj


o Código tá funcionando certinho, porém não puxa nada de dados =(.
Como eu to de Home office, eu to sem acesso ao banco de dados do servidor pra te passar as DDLS, só consigo testar os códigos pelo sistema
Responder

24/04/2020

Emerson Nascimento

nesse código que eu te passei eu retirei as referências à :cd_pessoa_fisica e :nr_sequencia. você corrigiu isso?
select
    a.ds_etapa,
    c.nr_seq_proj,
  
    'Imunização' A,
    case when coalesce(max(apseq.qtB),0) = 0 then 'Não' else 'Sim' end B,
    case when coalesce(max(apseq.qtC),0) = 0 then 'Não' else 'Sim' end C,
    case when coalesce(max(apseq.qtD),0) = 0 then 'Não' else 'Sim' end D,
    case when coalesce(max(apseq.qtE),0) = 0 then 'Não' else 'Sim' end E,
    case when coalesce(max(apseq.qtF),0) = 0 then 'Não' else 'Sim' end F,
  
    (case coalesce(max(apseq.totresultado),0)
        when 0 then 0
        when 1 then 20
        when 2 then 40
        when 3 then 60
        when 4 then 80
        when 5 then 100
    end) G,
  
    sum(a.QT_HORA_PREV) H,
    sum(a.QT_HORA_REAL) I,
  
    (case coalesce(max(apseq.totresultado),0)
        when 0 then 1
        when 1 then 20
        when 2 then 40
        when 3 then 60
        when 4 then 80
        when 5 then 100
    end) J,
  
    (sum(a.QT_HORA_REAL)*100) / coalesce(max(apseq.DivHr),100) - sum(a.QT_HORA_PREV) K,
  
    sum(a.QT_HORA_PREV) + (((sum(a.QT_HORA_REAL)*100)/coalesce(max(apseq.DivHr),100))-sum(a.QT_HORA_PREV)) L,
  
    case when sum(a.QT_HORA_PREV)+(((sum(a.QT_HORA_REAL)*100)/coalesce(max(apseq.DivHr),100))-sum(a.QT_HORA_PREV)) > sum(a.QT_HORA_PREV)
        then 'Neg'
        else 'Pos'
    end M
from
    PROJ_CRON_ETAPA a
inner join
    PROJ_CRONOGRAMA c on c.nr_sequencia = a.nr_seq_cronograma
left join
    (select
        ap.nr_sequencia,
        ap.nr_seq_tipo_avaliacao,
        sum(case when coalesce(r.nr_seq_item,0)=960 then r.qt_resultado else 0 end) qtB,
        sum(case when coalesce(r.nr_seq_item,0)=958 then r.qt_resultado else 0 end) qtC,
        sum(case when coalesce(r.nr_seq_item,0)=957 then r.qt_resultado else 0 end) qtD,
        sum(case when coalesce(r.nr_seq_item,0)=959 then r.qt_resultado else 0 end) qtE,
        sum(case when coalesce(r.nr_seq_item,0)=961 then r.qt_resultado else 0 end) qtF,
        sum(r.qt_resultado) totresultado,
        (case coalesce(sum(r.qt_resultado),0)
            when 0 then 100
            when 1 then 20
            when 2 then 40
            when 3 then 60
            when 4 then 80
            when 5 then 100
        end) DivHr
    from
        med_avaliacao_paciente ap
    left join
        med_avaliacao_result r on r.nr_seq_avaliacao = ap.nr_sequencia
    where
        (ap.cd_pessoa_fisica = :cd_pessoa_fisica or ap.cd_pessoa_fisica = 0)
        and ap.nr_seq_tipo_avaliacao = 214
    group by
        ap.nr_sequencia,
        ap.nr_seq_tipo_avaliacao
    ) apseq on apseq.nr_sequencia = c.nr_seq_proj and apseq.nr_seq_tipo_avaliacao = a.ds_etapa
where
    a.ds_etapa = '214'
    and c.nr_seq_proj = :nr_sequencia
group by
    a.ds_etapa,
    c.nr_seq_proj


Responder

27/04/2020

Leonardo Horning

nesse código que eu te passei eu retirei as referências à :cd_pessoa_fisica e :nr_sequencia. você corrigiu isso?
select
    a.ds_etapa,
    c.nr_seq_proj,
  
    'Imunização' A,
    case when coalesce(max(apseq.qtB),0) = 0 then 'Não' else 'Sim' end B,
    case when coalesce(max(apseq.qtC),0) = 0 then 'Não' else 'Sim' end C,
    case when coalesce(max(apseq.qtD),0) = 0 then 'Não' else 'Sim' end D,
    case when coalesce(max(apseq.qtE),0) = 0 then 'Não' else 'Sim' end E,
    case when coalesce(max(apseq.qtF),0) = 0 then 'Não' else 'Sim' end F,
  
    (case coalesce(max(apseq.totresultado),0)
        when 0 then 0
        when 1 then 20
        when 2 then 40
        when 3 then 60
        when 4 then 80
        when 5 then 100
    end) G,
  
    sum(a.QT_HORA_PREV) H,
    sum(a.QT_HORA_REAL) I,
  
    (case coalesce(max(apseq.totresultado),0)
        when 0 then 1
        when 1 then 20
        when 2 then 40
        when 3 then 60
        when 4 then 80
        when 5 then 100
    end) J,
  
    (sum(a.QT_HORA_REAL)*100) / coalesce(max(apseq.DivHr),100) - sum(a.QT_HORA_PREV) K,
  
    sum(a.QT_HORA_PREV) + (((sum(a.QT_HORA_REAL)*100)/coalesce(max(apseq.DivHr),100))-sum(a.QT_HORA_PREV)) L,
  
    case when sum(a.QT_HORA_PREV)+(((sum(a.QT_HORA_REAL)*100)/coalesce(max(apseq.DivHr),100))-sum(a.QT_HORA_PREV)) > sum(a.QT_HORA_PREV)
        then 'Neg'
        else 'Pos'
    end M
from
    PROJ_CRON_ETAPA a
inner join
    PROJ_CRONOGRAMA c on c.nr_sequencia = a.nr_seq_cronograma
left join
    (select
        ap.nr_sequencia,
        ap.nr_seq_tipo_avaliacao,
        sum(case when coalesce(r.nr_seq_item,0)=960 then r.qt_resultado else 0 end) qtB,
        sum(case when coalesce(r.nr_seq_item,0)=958 then r.qt_resultado else 0 end) qtC,
        sum(case when coalesce(r.nr_seq_item,0)=957 then r.qt_resultado else 0 end) qtD,
        sum(case when coalesce(r.nr_seq_item,0)=959 then r.qt_resultado else 0 end) qtE,
        sum(case when coalesce(r.nr_seq_item,0)=961 then r.qt_resultado else 0 end) qtF,
        sum(r.qt_resultado) totresultado,
        (case coalesce(sum(r.qt_resultado),0)
            when 0 then 100
            when 1 then 20
            when 2 then 40
            when 3 then 60
            when 4 then 80
            when 5 then 100
        end) DivHr
    from
        med_avaliacao_paciente ap
    left join
        med_avaliacao_result r on r.nr_seq_avaliacao = ap.nr_sequencia
    where
        (ap.cd_pessoa_fisica = :cd_pessoa_fisica or ap.cd_pessoa_fisica = 0)
        and ap.nr_seq_tipo_avaliacao = 214
    group by
        ap.nr_sequencia,
        ap.nr_seq_tipo_avaliacao
    ) apseq on apseq.nr_sequencia = c.nr_seq_proj and apseq.nr_seq_tipo_avaliacao = a.ds_etapa
where
    a.ds_etapa = '214'
    and c.nr_seq_proj = :nr_sequencia
group by
    a.ds_etapa,
    c.nr_seq_proj




As referências não estão nos Wheres ali???
Responder

27/04/2020

Leonardo Horning

nesse código que eu te passei eu retirei as referências à :cd_pessoa_fisica e :nr_sequencia. você corrigiu isso?
select
    a.ds_etapa,
    c.nr_seq_proj,
  
    'Imunização' A,
    case when coalesce(max(apseq.qtB),0) = 0 then 'Não' else 'Sim' end B,
    case when coalesce(max(apseq.qtC),0) = 0 then 'Não' else 'Sim' end C,
    case when coalesce(max(apseq.qtD),0) = 0 then 'Não' else 'Sim' end D,
    case when coalesce(max(apseq.qtE),0) = 0 then 'Não' else 'Sim' end E,
    case when coalesce(max(apseq.qtF),0) = 0 then 'Não' else 'Sim' end F,
  
    (case coalesce(max(apseq.totresultado),0)
        when 0 then 0
        when 1 then 20
        when 2 then 40
        when 3 then 60
        when 4 then 80
        when 5 then 100
    end) G,
  
    sum(a.QT_HORA_PREV) H,
    sum(a.QT_HORA_REAL) I,
  
    (case coalesce(max(apseq.totresultado),0)
        when 0 then 1
        when 1 then 20
        when 2 then 40
        when 3 then 60
        when 4 then 80
        when 5 then 100
    end) J,
  
    (sum(a.QT_HORA_REAL)*100) / coalesce(max(apseq.DivHr),100) - sum(a.QT_HORA_PREV) K,
  
    sum(a.QT_HORA_PREV) + (((sum(a.QT_HORA_REAL)*100)/coalesce(max(apseq.DivHr),100))-sum(a.QT_HORA_PREV)) L,
  
    case when sum(a.QT_HORA_PREV)+(((sum(a.QT_HORA_REAL)*100)/coalesce(max(apseq.DivHr),100))-sum(a.QT_HORA_PREV)) > sum(a.QT_HORA_PREV)
        then 'Neg'
        else 'Pos'
    end M
from
    PROJ_CRON_ETAPA a
inner join
    PROJ_CRONOGRAMA c on c.nr_sequencia = a.nr_seq_cronograma
left join
    (select
        ap.nr_sequencia,
        ap.nr_seq_tipo_avaliacao,
        sum(case when coalesce(r.nr_seq_item,0)=960 then r.qt_resultado else 0 end) qtB,
        sum(case when coalesce(r.nr_seq_item,0)=958 then r.qt_resultado else 0 end) qtC,
        sum(case when coalesce(r.nr_seq_item,0)=957 then r.qt_resultado else 0 end) qtD,
        sum(case when coalesce(r.nr_seq_item,0)=959 then r.qt_resultado else 0 end) qtE,
        sum(case when coalesce(r.nr_seq_item,0)=961 then r.qt_resultado else 0 end) qtF,
        sum(r.qt_resultado) totresultado,
        (case coalesce(sum(r.qt_resultado),0)
            when 0 then 100
            when 1 then 20
            when 2 then 40
            when 3 then 60
            when 4 then 80
            when 5 then 100
        end) DivHr
    from
        med_avaliacao_paciente ap
    left join
        med_avaliacao_result r on r.nr_seq_avaliacao = ap.nr_sequencia
    where
        (ap.cd_pessoa_fisica = :cd_pessoa_fisica or ap.cd_pessoa_fisica = 0)
        and ap.nr_seq_tipo_avaliacao = 214
    group by
        ap.nr_sequencia,
        ap.nr_seq_tipo_avaliacao
    ) apseq on apseq.nr_sequencia = c.nr_seq_proj and apseq.nr_seq_tipo_avaliacao = a.ds_etapa
where
    a.ds_etapa = '214'
    and c.nr_seq_proj = :nr_sequencia
group by
    a.ds_etapa,
    c.nr_seq_proj




As referências não estão nos Wheres ali???
Responder

27/04/2020

Leonardo Horning

testei o código aqui com a ETAPA 165, puxou os dados certos apenas no campo H e no campo I
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar