Como faço esse SELECT

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
fbarros300472
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 21 Set 2006 10:13 am
Localização: sp

Tenho duas tabelas: A e B.

A tabela A possui a movimentação da ficha financeira de cada funcionário mês a mês. A tabela B possui o histórico de seção de cada funcionário.

Tabela A: CHAPA, ANOCOMP, MESCOMP,DTPAGTO,VALOR.

Tabela B: CHAPA,DTMUDANCA,MOTIVO,CODSECAO.

Digamos que um fucnionário em janeiro de 2006 estava na seção 2 e em maio ele foi para seção 5. Ao cruzar estes dados com sua ficha financeira de 2006: A.CHAPA, A.ANOCOMP, A.MESCOMP, B.CODSECAO, A.VALOR,
preciso que ele me mostre de janeir à abril a seção 2 e de maio a setembro a seção 5.
Avatar do usuário
TBou
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 136
Registrado em: Qui, 05 Ago 2004 9:33 am
Localização: Campo Grande - MS
Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

bom neste caso você teria que fazer uma select interna para trazer a secao
e não colocaria a tabela B no from, veja

Selecionar tudo

select A.CHAPA, 
       A.ANOCOMP, 
       A.MESCOMP, 
       (SELECT MAX(NR_SECAO) FROM B
         WHERE A.CHAPA = B.CHAPA
           AND TO_DATE('01'||A.MESCOMP||A.ANOCOMP,'DDMMRRRR') < TRUNC(B.DTPAGTO)) CODSECAO, 
       A.VALOR
  FROM A

detalhe neste caso trará o maior codigo de secao antes da data alteração.
Avatar do usuário
TBou
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 136
Registrado em: Qui, 05 Ago 2004 9:33 am
Localização: Campo Grande - MS
Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

opas...foi mal...na verdade coloquei o sinal invertido...o correto é maior

Selecionar tudo

TO_DATE('01'||A.MESCOMP||A.ANOCOMP,'DDMMRRRR') > TRUNC(B.DTPAGTO)
Avatar do usuário
TBou
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 136
Registrado em: Qui, 05 Ago 2004 9:33 am
Localização: Campo Grande - MS
Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

tabela A

Selecionar tudo

CHAPA      ANOC ME DTPAGTO              VALOR     
---------- ---- -- -------------------- ----------
        12 2006 01 28/09/2006                  100
        12 2006 02 28/09/2006                  100
        12 2006 03 28/09/2006                  100
        12 2006 04 28/09/2006                  100
        12 2006 05 28/09/2006                  100
        12 2006 06 28/09/2006                  100
        12 2006 07 28/09/2006                  100
        12 2006 08 28/09/2006                  100
        12 2006 09 28/09/2006                  100
        12 2006 10 28/09/2006                  100
        12 2006 11 28/09/2006                  100
        12 2006 12 28/09/2006                  100
Tabela B

Selecionar tudo

CHAPA      DTMUDANCA            MOTIVO        CODSECAO  
---------- -------------------- ------------- ----------
        12 01/05/2006           TESTE            5
        12 01/08/2006           TESTE            8
        12 01/12/2005           TESTE            2
fazendo a select

Selecionar tudo

SQLWKS> select A.CHAPA,
     2>        A.ANOCOMP,
     3>        A.MESCOMP,
     4>        (SELECT MAX(CODSECAO) FROM B
     5>          WHERE A.CHAPA = B.CHAPA
     6>            AND TO_DATE('01'||A.MESCOMP||A.ANOCOMP,'DDMMRRRR') >= TRUNC(B.DTMUDANCA)) CODSECAO,
     7>        A.VALOR
     8>   FROM A 
     9> 
CHAPA      ANOC ME CODSECAO   VALOR     
---------- ---- -- ---------- ----------
        12 2006 01          2        100
        12 2006 02          2        100
        12 2006 03          2        100
        12 2006 04          2        100
        12 2006 05          5        100
        12 2006 06          5        100
        12 2006 07          5        100
        12 2006 08          8        100
        12 2006 09          8        100
        12 2006 10          8        100
        12 2006 11          8        100
        12 2006 12          8        100
12 linhas selecionadas.
eu acho que é desta forma que você precisa certo?
fbarros300472
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 73
Registrado em: Qui, 21 Set 2006 10:13 am
Localização: sp

Oi Thiago, beleza?

Só falta um pequeno detalhe para que a sql funcione. Quando a mundança de seção acontece em ordem numérica, ela funciona direitinho. Se alternar a ordem numérica da seção: 01/12/2005, 2; 01/05/2006, 8; 01/09/2006, 3; na ora de exibir os dados, a seção 3 não será exibida. Seção 2 até 07/2006 e seção 8 de 05/2006 em diante. Obrigado pela atenção.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes