Jump to content
Excluído

Dúvida sentença SQL<b> (Resolvido)</b>

Recommended Posts

Bom dia pessoal, tenho uma sentença SQL que quando o funcionário têm o mesmo código de evento em períodos diferentes dentro da mesma competência ela duplica todos os eventos da ficha financeira, exemplo:

Competência Fevereiro/2008 Período 1

Evento 0013

Evento 0102

Evento 0402

Competência Fevereiro/2008 Período 10

Evento 0002

Evento 0039

Evento 0040

Evento 0084

Evento 0086

Evento 0088

Evento 0153

Evento 0401

Evento 0402

Evento 0403

Evento 0409

Evento 0410

Evento 0414

Evento 0432

Evento 0459

Vejam que somente o evento 0402 se repete em períodos diferentes, porém no resultado da SQL, todos os outros eventos são duplicados!

Sentença SQL:

select a.codsecao, c.descricao, a.codfilial, a.nome, a.chapa, a.codhorario, a.salario,

isnull(sum(b.ref),0.00), isnull(sum(b.valor),0.00),

isnull(sum(br.valor),0.00)

from pfunc a

left outer join pffinanc b on a.codcoligada = b.codcoligada

and a.chapa = b.chapa

and b.codevento in (0002)

and b.mescomp =:PLN_B$3$_N

and b.anocomp =:PLN_B$4$_N

and b.nroperiodo <>20

left outer join pffinanc br on a.codcoligada = br.codcoligada

and a.chapa = br.chapa

and br.codevento in (0402)

and br.mescomp =:PLN_B$3$_N

and br.anocomp =:PLN_B$4$_N

and br.nroperiodo <>20

left outer join psecao c on a.codcoligada = c.codcoligada

and a.codsecao = c.codigo

left outer join pfuncao d on a.codcoligada = d.codcoligada

and a.codfuncao = d.codigo

WHERE

a.codfilial like:PLN_B$1$_S

and a.codsecao like:PLN_B$2$_S

and a.codcoligada = 1

and (b.valor > 0 or br.valor > 0)

GROUP BY a.codsecao, c.descricao, a.codfilial, a.nome, a.chapa, a.codhorario, a.salario

Share this post


Link to post
Share on other sites

Jefferson Bruzati,

Vc ja Tentou usar uma Union em vez de usar a pffinanc com referências diferentes ('BR','B'), vejo que left outer join e por razão da restrição dos eventos, ou eu estou engando?

sds

Share this post


Link to post
Share on other sites

Meu caro, o que vc está precisando é de uma select que te retorne a tua folha analitica e os valores dos eventos dos funcionarios nas determinadas filiais e nos determinados periodos.. com os parametros das filias e periodos não e isso?, salvo to enganado já ví essa planilha aqui no Forum, dar uma olhada na seção de cubos..

sds

Share this post


Link to post
Share on other sites

Jefferson, cara, é mais ou menos isso mesmo. Mudei aqui a sentença e está retornando correto. Olha ai:

select top 30

a.codsecao, 'Nome do Funcionario... ' Nome,

-- c.descricao, a.codfilial, a.nome, a.chapa,

a.codhorario, a.salario,

isnull(sum(b.ref),0.00) RefB,

isnull(sum(b.valor),0.00) ValorB, -- valor do Evento 0002

isnull(sum(br.ref),0.00) RefBR,

isnull(sum(br.valor),0.00) ValorBR-- Valor do Evento 0402

from pfunc a

left outer join pffinanc b on a.codcoligada = b.codcoligada

and a.chapa = b.chapa

and b.codevento in ('0002')

--and b.mescomp =:PLN_B$3$_N

--and b.anocomp =:PLN_B$4$_N

and b.mescomp = 3

and b.anocomp = 2008

and b.nroperiodo <>20

left outer join pffinanc br on a.codcoligada = br.codcoligada

and a.chapa = br.chapa

and br.codevento in ('0004')

--and br.mescomp =:PLN_B$3$_N

--and br.anocomp =:PLN_B$4$_N

and br.mescomp = 3

and br.anocomp = 2008

and br.nroperiodo <>20

left outer join psecao c on a.codcoligada = c.codcoligada

and a.codsecao = c.codigo

left outer join pfuncao d on a.codcoligada = d.codcoligada

and a.codfuncao = d.codigo

WHERE

--a.codfilial like:PLN_B$1$_S

--and a.codsecao like:PLN_B$2$_S

a.codfilial >=0

and a.codsecao >= '0'

and a.codcoligada = 2

and (b.valor > 0 or br.valor > 0)

GROUP BY a.codsecao, c.descricao, a.codfilial, a.nome, a.chapa, a.codhorario, a.salario

** resultado neste exemplo... Mudei pra mostrar apenas 30 primeiros registros, e apenas

** para quem tinha o valor do evento 0004 ( IRRF ) foi mostrado algo na segunda coluna do valor.

CodSecao Nome ................ CodHor.. Salario. .RefB. .ValorB. .RefBR. .ValorBR.

01.003 Nome do Funcionario... 020 4390.62 30.00 4390.62 27.50 452.83

01.003 Nome do Funcionario... 020 4390.62 30.00 4390.62 27.50 528.72

01.003 Nome do Funcionario... 066 3077.06 30.00 3077.06 15.00 184.79

01.003 Nome do Funcionario... 066 3077.06 30.00 3077.06 15.00 184.79

01.003 Nome do Funcionario... 025 4390.62 30.00 4390.62 27.50 528.72

01.027 Nome do Funcionario... 026 620.55 18.00 372.33 .00 .00

01.024 Nome do Funcionario... 026 988.68 30.00 988.68 .00 .00

01.003 Nome do Funcionario... 066 4390.62 30.00 4390.62 27.50 528.72

01.039 Nome do Funcionario... 026 1671.17 1.00 55.71 .00 .00

01.024 Nome do Funcionario... 026 2032.29 10.00 677.43 .00 .00

01.003 Nome do Funcionario... 025 3077.06 30.00 3077.06 15.00 184.79

01.024 Nome do Funcionario... 026 2032.29 30.00 2032.29 15.00 116.49

01.003 Nome do Funcionario... 025 3077.06 30.00 3077.06 15.00 105.68

01.026 Nome do Funcionario... 026 1257.09 30.00 1257.09 .00 .00

01.003 Nome do Funcionario... 026 2949.67 30.00 2949.67 15.00 187.81

01.003 Nome do Funcionario... 025 3077.06 30.00 3077.06 15.00 77.57

01.024 Nome do Funcionario... 026 2112.92 30.00 2112.92 15.00 28.16

01.024 Nome do Funcionario... 026 2112.92 30.00 2112.92 15.00 118.81

01.024 Nome do Funcionario... 026 2032.29 30.00 2032.29 15.00 154.55

01.024 Nome do Funcionario... 026 2032.29 30.00 2032.29 15.00 137.73

01.024 Nome do Funcionario... 026 2112.92 30.00 2112.92 .00 .00

01.030 Nome do Funcionario... 219 1021.40 30.00 1021.40 .00 .00

01.024 Nome do Funcionario... 026 2808.59 30.00 2808.59 15.00 169.02

01.024 Nome do Funcionario... 026 2032.29 30.00 2032.29 15.00 145.49

01.030 Nome do Funcionario... 219 1021.40 30.00 1021.40 .00 .00

01.003 Nome do Funcionario... 025 3077.06 30.00 3077.06 15.00 164.10

01.003 Nome do Funcionario... 025 4390.62 30.00 4390.62 27.50 528.72

01.003 Nome do Funcionario... 025 4390.62 30.00 4390.62 27.50 528.72

01.024 Nome do Funcionario... 026 2032.29 26.00 1761.32 15.00 21.10

01.039 Nome do Funcionario... 061 1671.17 30.00 1671.17 15.00 43.66

Share this post


Link to post
Share on other sites

Jefferson,

O problema dessa sentença é que vocês está trazendo duas vezes a tabela PFFINANC. Você deve unir a segunda tabela com as mesmas chaves da primeira, ou seja, CODCOLIGADA, CHAPA, CODEVENTO, NROPERIODO. Mas isso não dará certo, porque você terá que ter o mesmo Evento nos dois períodos.

Para solucionar seu problema você deve deixar a PFFINANC uma única vez e fazer um CASE para trazer valor ora num Evento ora em outro.

Entendeu?

Att,

Share this post


Link to post
Share on other sites

select a.codsecao, c.descricao, a.codfilial, a.nome, a.chapa, a.codhorario, a.salario,

CASE WHEN B.CODEVENTO = '0002' THEN isnull(sum(b.ref),0.00)

ELSE 0

END,

CASE WHEN B.CODEVENTO = '0002' THEN isnull(sum(b.valor),0.00)

ELSE 0

END,

CASE WHEN B.CODEVENTO = '0402' THEN isnull(sum(B.valor),0.00)

ELSE 0

END

from pfunc a

left outer join pffinanc b on a.codcoligada = b.codcoligada

and a.chapa = b.chapa

and b.codevento in ('0002','0402')

and b.mescomp =:PLN_B$3$_N

and b.anocomp =:PLN_B$4$_N

and b.nroperiodo <>20

left outer join psecao c on a.codcoligada = c.codcoligada

and a.codsecao = c.codigo

left outer join pfuncao d on a.codcoligada = d.codcoligada

and a.codfuncao = d.codigo

WHERE

a.codfilial like:PLN_B$1$_S

and a.codsecao like:PLN_B$2$_S

and a.codcoligada = 1

and (b.valor > 0 or br.valor > 0)

GROUP BY a.codsecao, c.descricao, a.codfilial, a.nome, a.chapa, a.codhorario, a.salario

Share this post


Link to post
Share on other sites

Maffra, a sentença está dando erro e com esse select eu consigo setar um evento para cada coluna na planilha, exemplo:

0002 0402

500,00 150,00

Share this post


Link to post
Share on other sites

Consegui, segue o que foi alterado:

select a.codsecao, c.descricao, a.codfilial, a.nome, a.chapa, a.codhorario, a.salario,

CASE WHEN B.CODEVENTO = '0002' THEN isnull(sum(b.ref),0.00)

ELSE 0

END,

CASE WHEN B.CODEVENTO = '0002' THEN isnull(sum(b.valor),0.00)

ELSE 0

END,

CASE WHEN B.CODEVENTO = '0402' THEN isnull(sum(B.valor),0.00)

ELSE 0

END

from pfunc a

left outer join pffinanc b on a.codcoligada = b.codcoligada

and a.chapa = b.chapa

and b.codevento in ('0002','0402')

and b.mescomp =:PLN_B$3$_N

and b.anocomp =:PLN_B$4$_N

and b.nroperiodo <>20

left outer join psecao c on a.codcoligada = c.codcoligada

and a.codsecao = c.codigo

left outer join pfuncao d on a.codcoligada = d.codcoligada

and a.codfuncao = d.codigo

WHERE

a.codfilial like:PLN_B$1$_S

and a.codsecao like:PLN_B$2$_S

and a.codcoligada = 1

and (b.valor > 0 or br.valor > 0)

GROUP BY a.codsecao, c.descricao, a.codfilial, a.nome, a.chapa, a.codhorario, a.salario, b.codevento

Share this post


Link to post
Share on other sites

é... na pressa eu fiz um relacionamento errado e escrevi um campo errado....

falha técnica....

tópico resolvido???

Share this post


Link to post
Share on other sites

Cara, vc chegou pra fazer a diferença mesmo, vou analisar antes de dar como resolvido, mas agradeço a agilidade e presteza.

Share this post


Link to post
Share on other sites

Que isso Jefferson,

não é nada... estamos aqui pra isso.

Quando tiver 'ok' manda um novo post para podermos colocar como resolvido, assim você também nos ajuda.

Obrigado,

Share this post


Link to post
Share on other sites

Putz até no meu exemplo que lhe enviei estava realmente duplicando alguns casos e não vi.

Que bom que o Maffra deu uma força ai e resolveu.

Mais uma vez, valeu a força ae Maffra. :cray:

Share this post


Link to post
Share on other sites

Valeu sidroch@, mas essa planilha é exatamente igual a minha planilha original, cuidado que essa planilha duplica os valores, qualquer dúvida leia o início do tópico.

Agradeço sua atenção!

Share this post


Link to post
Share on other sites

Bom dia Maffra, estou direcionando a resposta para vc devido a estar mais por dentro do assunto, mas vale pra todos os membros, nessa sentença eu fui obrigado a acrescentar o group by b.codevento, porém o resultado da planilha aparece uma linha para cada evento, até ai tudo bem, por isso o group by b.codevento, porém eu quero que saia todos os eventos na mesma linha, como fazer?

Obrigado

Share this post


Link to post
Share on other sites

Jefferson,

Você está sendo obrigado a colocar o GROUP BY do CODEVENTO por que o SUM está para o campo B.VALOR.

Se você tirar o SUM do B.VALOR e colocá-lo no CASE você não precisará agrupá-lo e ficará da forma mais correta e aplicável.

Veja exemplo:

A forma como está:

CASE WHEN B.CODEVENTO = '0002' THEN isnull(sum(b.ref),0.00)

ELSE 0

END

Substitua para:

SUM(CASE WHEN B.CODEVENTO = '0002' THEN isnull((b.ref),0.00)

ELSE 0

END)

e retire o "b.codevento" do GROUP BY

Att,

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.