none
Consulta com Case When porem com condição também no resultado do Then RRS feed

  • Question

  • Bom dia pessoal, 

    to me aventurando a montar uma consulta porem não estou conseguindo solucionar um problema.

    Preciso usar o Case When porem o resultado do Then eu preciso fazer uma consulta para trazer resultado.

    A consulta que cheguei ate o momento é a seguinte: 

    select 
    	im.DtReferencia, 
    	e.cdchamada,
    	 case 
    		when e.CdChamada in ('019', '020', '021', '022') then '598' 
    		when e.cdchamada in ('023') then 
    					(select c.cdchamada
    					from 	wdp.im00391 im
    					inner join
    					wdp.CadAuto ca on (im.MatriculaContr = ca.CdMatricula)
    					inner join
    					wdp.ievento e on (im.IdEvento = e.IdEvento)
    					inner join
    					wcont.contas c on (ca.NmSocio = c.NmConta)
    					where c.CdClassInterna >= '2.3.01.05.0001' and c.CdClassInterna <= '2.3.01.05.9999'))
    				 end as Debito,
    	im.vlevento, 
    	ca.NmSocio,
    	from 
    		wdp.im00391 im
    	inner join
    		wdp.CadAuto ca on (im.MatriculaContr = ca.CdMatricula)
    	inner join
    		wdp.ievento e on (im.IdEvento = e.IdEvento)
    	inner join
    		wcont.contas c on (ca.NmSocio = c.NmConta)
    	where
    		im.DtReferencia >= '2019-03-01 00:00:00.000'
    se o e.cdchamada for 023 ele precisa trazer um cod de chamada que esta em outra tabela porem ele precisa buscar essa informação dentro de uma classificação especifica.
    Wednesday, June 26, 2019 11:26 AM

Answers

  • Consegui resolver ficou assim o cod final.

    estava colocando a mesma condição na sub-query e na query principal, por isso estava trazendo mais informações.

    select
    		m.DtPagamento, 
    		m.IdEvento,
    		case 
    			when m.IdEvento in ('003') then '4753'
    			when m.IdEvento in ('013') and m.TpContribuinte = 'A' then 
    										(select top 1 c2.cdchamada
    												from 	
    													wdp.CadAuto ca2,
    													wcont.contas c2 
    												where 
    													c2.CdClassInterna >= '2.1.08.01.0001' and c2.CdClassInterna <= '2.1.08.01.9999'
    												
    												and m.IdContribuinte = ca2.CdMatricula
    												and ca2.NmSocio = c2.NmConta
    												)
    			when m.IdEvento in ('013') and m.TpContribuinte = 'S' then '4767'
    			when m.IdEvento in ('014') and m.TpContribuinte = 'A' then 
    										(select top 1 c3.cdchamada
    												from 	
    													wdp.CadAuto ca3,
    													wcont.contas c3 
    												where 
    													c3.CdClassInterna >= '2.1.08.01.0001' and c3.CdClassInterna <= '2.1.08.01.9999'
    												
    												and m.IdContribuinte = ca3.CdMatricula
    												and ca3.NmSocio = c3.NmConta
    												)
    			when m.IdEvento in ('014') and m.TpContribuinte = 'S' then '4767'
    			when m.IdEvento in ('002','019', '020', '021', '022') then '598' 
    			when m.IdEvento in ('023', '010') then 
    											(select top 1 c2.cdchamada
    												from 	
    													wdp.CadAuto ca2,
    													wcont.contas c2 
    												where 
    													c2.CdClassInterna >= '2.3.01.05.0001' and c2.CdClassInterna <= '2.3.01.05.9999'
    												
    												and m.IdContribuinte = ca2.CdMatricula
    												and ca2.NmSocio = c2.NmConta
    												)
    			when m.IdEvento in ('024') then '1634'
    			when m.IdEvento in ('025') then '1627'
    												 end as Debito,
    		case
    			when m.IdEvento in ('003') then '4767'
    			when m.IdEvento in ('013') then '2324'
    			when m.IdEvento in ('014') then '2373'
    			when m.IdEvento in ('002','019', '020', '021', '022') then
    											(select top 1 c2.cdchamada
    												from 	
    													wdp.CadAuto ca2,
    													wcont.contas c2 
    												where 
    													c2.CdClassInterna >= '2.1.08.01.0001' and c2.CdClassInterna <= '2.1.08.01.9999'
    												
    												and m.IdContribuinte = ca2.CdMatricula
    												and ca2.NmSocio = c2.NmConta
    												)
    			when m.IdEvento in ('023','010') then 
    											(select top 1 c2.cdchamada
    												from 	
    													wdp.CadAuto ca2,
    													wcont.contas c2 
    												where 
    													c2.CdClassInterna >= '2.3.01.01.0001' and c2.CdClassInterna <= '2.3.01.01.9999'
    												
    												and m.IdContribuinte = ca2.CdMatricula
    												and ca2.NmSocio = c2.NmConta
    												)
    			when m.IdEvento in ('024') then '1578'
    			when m.IdEvento in ('025') then '1585'
    												 end as Credito,
    		m.vlevento, 
    		CASE
    			when m.IdEvento in ('019', '020', '021', '022') then 
    				'Apropriação de Produção Cooperativista ref ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) + ' - ' +ca.NmSocio
    			when m.IdEvento in ('023','010') then
    				'Valor recebido de cooperado ref cota parte cf recibo de Outros Descontos ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) +' - ' + ca.NmSocio
    			when m.IdEvento in ('002', '003') then 
    				'Apropriação de Pro-labore ref ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) + ' - ' +ca.NmSocio
    			when m.IdEvento in ('013') then 
    				'Apropriação de INSS ref ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) + ' - ' +ca.NmSocio
    			when m.IdEvento in ('014') then 
    				'Apropriação de IRRF ref ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) + ' - ' +ca.NmSocio
    			when m.IdEvento in ('024', '025') then 
    				'Apropriação de cédula de presença ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) + ' - ' +ca.NmSocio
    
    				end as historico,
    		m.NmDepartamento,
    		m.NmEvento,
    		ca.NmSocio,
    		m.IdContribuinte
    	from 
    		wdp.ir00391 m
    	inner join
    		wdp.CadAuto ca on (m.IdContribuinte = ca.CdMatricula)
    	where
    		m.VlEvento > '0' and year(m.DtPagamento) >= '2019'

    • Marked as answer by José Diz Wednesday, July 3, 2019 12:51 PM
    Wednesday, July 3, 2019 10:41 AM

All replies

  • Lekao87,

    Certo, mas qual esta sendo a dificuldade? Aparentemente você esta fazendo a busca do dado dentro da subquery?

    Sinceramente eu não consegui entender a sua dúvida ou dificuldade.

    Vou propor uma pequena mudança no Código, mas elão não se refere a sua dúvida, é somente uma observação minha. Neste trecho, como você vai utilizar condição específica, eu trocaria o operador In pela sinal de Igual:

    when e.cdchamada = ('023') then 
    					(select c.cdchamada
    					from 	wdp.im00391 im
    					inner join
    					wdp.CadAuto ca on (im.MatriculaContr = ca.CdMatricula)
    					inner join
    					wdp.ievento e on (im.IdEvento = e.IdEvento)
    					inner join
    					wcont.contas c on (ca.NmSocio = c.NmConta)
    					where c.CdClassInterna >= '2.3.01.05.0001' and c.CdClassInterna <= '2.3.01.05.9999'))
    				 end as Debito,

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    Wednesday, June 26, 2019 12:14 PM
  • Bom dia,

    Lekao87, experimente fazer uns testes dessa forma:

    	case 
    		when e.CdChamada in ('019', '020', '021', '022') then '598' 
    		when e.cdchamada = '023' then 
    			(select top(1) cs.cdchamada
    			from	wcont.contas cs
    			where
    				cs.NmConta = ca.NmSocio and
    				cs.CdClassInterna >= '2.3.01.05.0001' and cs.CdClassInterna <= '2.3.01.05.9999')
    	end as Debito,
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    Wednesday, June 26, 2019 12:32 PM
  • se o e.cdchamada for 023 ele precisa trazer um cod de chamada que esta em outra tabela porem ele precisa buscar essa informação dentro de uma classificação especifica.

    Essa outra pesquisa retorna somente uma linha ou pode retornar mais de uma linha?

    Se retornar mais de uma linha, como escolher qual linha exibir?


    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Thursday, June 27, 2019 11:43 AM
  • Consegui resolver ficou assim o cod final.

    estava colocando a mesma condição na sub-query e na query principal, por isso estava trazendo mais informações.

    select
    		m.DtPagamento, 
    		m.IdEvento,
    		case 
    			when m.IdEvento in ('003') then '4753'
    			when m.IdEvento in ('013') and m.TpContribuinte = 'A' then 
    										(select top 1 c2.cdchamada
    												from 	
    													wdp.CadAuto ca2,
    													wcont.contas c2 
    												where 
    													c2.CdClassInterna >= '2.1.08.01.0001' and c2.CdClassInterna <= '2.1.08.01.9999'
    												
    												and m.IdContribuinte = ca2.CdMatricula
    												and ca2.NmSocio = c2.NmConta
    												)
    			when m.IdEvento in ('013') and m.TpContribuinte = 'S' then '4767'
    			when m.IdEvento in ('014') and m.TpContribuinte = 'A' then 
    										(select top 1 c3.cdchamada
    												from 	
    													wdp.CadAuto ca3,
    													wcont.contas c3 
    												where 
    													c3.CdClassInterna >= '2.1.08.01.0001' and c3.CdClassInterna <= '2.1.08.01.9999'
    												
    												and m.IdContribuinte = ca3.CdMatricula
    												and ca3.NmSocio = c3.NmConta
    												)
    			when m.IdEvento in ('014') and m.TpContribuinte = 'S' then '4767'
    			when m.IdEvento in ('002','019', '020', '021', '022') then '598' 
    			when m.IdEvento in ('023', '010') then 
    											(select top 1 c2.cdchamada
    												from 	
    													wdp.CadAuto ca2,
    													wcont.contas c2 
    												where 
    													c2.CdClassInterna >= '2.3.01.05.0001' and c2.CdClassInterna <= '2.3.01.05.9999'
    												
    												and m.IdContribuinte = ca2.CdMatricula
    												and ca2.NmSocio = c2.NmConta
    												)
    			when m.IdEvento in ('024') then '1634'
    			when m.IdEvento in ('025') then '1627'
    												 end as Debito,
    		case
    			when m.IdEvento in ('003') then '4767'
    			when m.IdEvento in ('013') then '2324'
    			when m.IdEvento in ('014') then '2373'
    			when m.IdEvento in ('002','019', '020', '021', '022') then
    											(select top 1 c2.cdchamada
    												from 	
    													wdp.CadAuto ca2,
    													wcont.contas c2 
    												where 
    													c2.CdClassInterna >= '2.1.08.01.0001' and c2.CdClassInterna <= '2.1.08.01.9999'
    												
    												and m.IdContribuinte = ca2.CdMatricula
    												and ca2.NmSocio = c2.NmConta
    												)
    			when m.IdEvento in ('023','010') then 
    											(select top 1 c2.cdchamada
    												from 	
    													wdp.CadAuto ca2,
    													wcont.contas c2 
    												where 
    													c2.CdClassInterna >= '2.3.01.01.0001' and c2.CdClassInterna <= '2.3.01.01.9999'
    												
    												and m.IdContribuinte = ca2.CdMatricula
    												and ca2.NmSocio = c2.NmConta
    												)
    			when m.IdEvento in ('024') then '1578'
    			when m.IdEvento in ('025') then '1585'
    												 end as Credito,
    		m.vlevento, 
    		CASE
    			when m.IdEvento in ('019', '020', '021', '022') then 
    				'Apropriação de Produção Cooperativista ref ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) + ' - ' +ca.NmSocio
    			when m.IdEvento in ('023','010') then
    				'Valor recebido de cooperado ref cota parte cf recibo de Outros Descontos ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) +' - ' + ca.NmSocio
    			when m.IdEvento in ('002', '003') then 
    				'Apropriação de Pro-labore ref ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) + ' - ' +ca.NmSocio
    			when m.IdEvento in ('013') then 
    				'Apropriação de INSS ref ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) + ' - ' +ca.NmSocio
    			when m.IdEvento in ('014') then 
    				'Apropriação de IRRF ref ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) + ' - ' +ca.NmSocio
    			when m.IdEvento in ('024', '025') then 
    				'Apropriação de cédula de presença ' + convert(char(2), month(m.DtPagamento)) + '/'+ convert(char(4), year(m.DtPagamento)) + ' - ' +ca.NmSocio
    
    				end as historico,
    		m.NmDepartamento,
    		m.NmEvento,
    		ca.NmSocio,
    		m.IdContribuinte
    	from 
    		wdp.ir00391 m
    	inner join
    		wdp.CadAuto ca on (m.IdContribuinte = ca.CdMatricula)
    	where
    		m.VlEvento > '0' and year(m.DtPagamento) >= '2019'

    • Marked as answer by José Diz Wednesday, July 3, 2019 12:51 PM
    Wednesday, July 3, 2019 10:41 AM
  • Bom dia,

    Lekao87, posso estar enganado mas da forma como está o seu código acima, me parece que não é necessário utilizar a tabela CadAuto nas subquerys, já que a mesma é utilizada na query principal e a junção é feita com as mesmas colunas.

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    Wednesday, July 3, 2019 1:30 PM