Comando SQL pra rateio

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Comando SQL pra rateio

Mensagem por JoséQuintas »

Qual seria o comando pra fazer isto:

Tenho a tabela de recibos com um CPF.
E tenho uma tabela com rateios de cada CPF para várias pessoas - vários registros.
O objetivo é trazer cada recibo, separando o que vai pra cada pessoa.

recibo 10 10% para antonio
recibo 10 10% para julio
recibo 10 80% para chico

recibo 11 100% para antonio

É como se fosse um do while no primeiro, fazendo um select do segundo e juntando tudo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Comando SQL pra rateio

Mensagem por alxsts »

Olá!

A princípio parece simples. Um Join resolverá mas não entendi...

- O total de cada recibo está na tabela "Recibo" ?
- A tabela "Rateio" tem apenas o percentual de cada rateio? Ou já tem o valor correspondente ao percentual?
- O nome do beneficiário está em uma terceira tabela ou na primeira?
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Comando SQL pra rateio

Mensagem por JoséQuintas »

alxsts escreveu:A princípio parece simples. Um Join resolverá mas não entendi...
- O total de cada recibo está na tabela "Recibo" ?
- A tabela "Rateio" tem apenas o percentual de cada rateio? Ou já tem o valor correspondente ao percentual?
- O nome do beneficiário está em uma terceira tabela ou na primeira?
Tabela 1:
RECIBO CPF

Tabela 2:
CPF1 percentual1 nome1
CPF1 percentual2 nome2
CPF1 percentual3 nome3
CPF2 percentual1 nome1
CPF3 percentual1 nome1
CPF3 percentual2 nome2

seria algo como:

SELECT ( select * from rateio ) from RECIBO

preciso do retorno:
recibo1, rateiocpf.nome1
recibo1, rateiocpf.nome2
recibo1, rateiocpf.nome3
recibo2, rateiocpf.nome1
recibo2, rateiocpf.nome2
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Comando SQL pra rateio

Mensagem por JoséQuintas »

Uma situação equivalente:

Tem lá os recibos de pagamento em nome do pai, e vai ser dividido entre os filhos.
a primeira tabela tem os recibos
a segunda tabela tem os pais, os filhos, e os rateios
Vou imprimir cada recibo e cada divisão.

Então cada recibo tem que vir N vezes, a mesma quantidade de filhos do pai que estiver no recibo.

Na hora de imprimir, vai ser recibo, pai, filho, ( recibo * percentual )

Equivalente a isto

Código: Selecionar todos

SELECT recibo
DO WHILE ! recibo->Eof()
   SELECT rateios
   SEEK recibo->CPF
   DO WHILE recibo->cpf == rateios->cpf .AND. ! rateios->eof()
   ? recibo->numero, recibo->Cpf, rateios->percentual, rateios->nome
     SKIP
   ENDDO
   SELECT recibo
   SKIP
ENDDO
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Comando SQL pra rateio

Mensagem por JoséQuintas »

RESOLVIDO.

Não precisa nada diferente.
EU não sabia que o MySQL faz isso sozinho quando o relacionamento retorna mais de um registro.

Quando faz o join com clientes... trás só o cliente ok...
Quando faz o join com rateios... ok... repete o registro várias vezes pra cada rateio.

Agora é só incluir o cálculo no select e pronto.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Comando SQL pra rateio

Mensagem por alxsts »

Olá!

Que bom que resolveu.
JoséQuintas escreveu:EU não sabia que o MySQL faz isso sozinho quando o relacionamento retorna mais de um registro
Sim, isto é padrão de SQL, em qualquer RDBMS.

Não testei mas acho que o número do recibo deveria existir na tabela dos rateios. Caso contrário, fazendo a junção (join) apenas pelo CPF, pode computar os rateios de 2 recibos (do mesmo CPF) num só. É o caso do "Antonio" no teu exemplo:

recibo 10 10% para antonio
recibo 10 10% para julio
recibo 10 80% para chico

recibo 11 100% para antonio
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Comando SQL pra rateio

Mensagem por JoséQuintas »

alxsts escreveu:Não testei mas acho que o número do recibo deveria existir na tabela dos rateios.
Caso contrário, fazendo a junção (join) apenas pelo CPF, pode computar os rateios de 2 recibos (do mesmo CPF) num só. É o caso do "Antonio" no teu exemplo:
na prática é por dono e imóvel, e o rateio idem.
fez certinho.

INNER JOIN RATEIO ON rateio.dono = recibo.dono and rateio.imovel = recibo.imovel
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder