Usuário com melhor resposta
Consulta com Case When porem com condição também no resultado do Then

Pergunta
-
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.
Respostas
-
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'
Todas as Respostas
-
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]
- Editado Junior Galvão - MVPMVP quarta-feira, 26 de junho de 2019 12:26 Alteração no conteúdo da resposta.
- Sugerido como Resposta IgorFKModerator quarta-feira, 26 de junho de 2019 13:40
-
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
- Sugerido como Resposta IgorFKModerator quarta-feira, 26 de junho de 2019 13:40
-
-
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'
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 3 de julho de 2019 15:52