Eu tenho duas tabelas (Pedidos, Pagamentos) eles são de 1 para muitos relacionamentos (1:N) Um pedido pode ter muitos pagamentos
Tabela 1: Pedidos
Eu iria | preço total |
---|---|
1 | 1000 |
2 | 2000 |
3 | 3000 |
Tabela 2: Pagamentos
order_id(FK de Pedidos) | valor_pago |
---|---|
1 | 500 |
2 | 2000 |
3 | 1000 |
3 | 500 |
3 | 750 |
alguns pedidos não são totalmente pagos, então quero receber
1- o restante pago de cada pedido .. Como:
ordem | resto pago |
---|---|
1 | 500 |
3 | 750 |
2- a soma do resto de todos os pedidos como: 1250
E obrigado.
Para resolver seu problema, fiz o seguinte (todo o código abaixo está disponível no violino aqui ):
preencher:
Eu usei
_order
para o nome da tabela em vez deorders
porque não gosto de nomes plurais de tabela - uma tabela é um conjunto e deve ter um nome singular. Pode conter 0, 1 ou muitos registros - não necessariamente muitos. Eu também uso snake_case para nomes de tabelas. Estas são apenas coisas pessoais - escolha uma convenção e cumpra-a!Então:
e:
e execute o seguinte SQL:
Resultado:
Deixei os campos extras lá para que você possa ver o que está acontecendo. Podemos limpar isso da seguinte maneira para obter o resultado desejado:
Resultado:
e para obter a soma total do que é devido para cada pedido, fazemos o seguinte:
Resultado:
Et voilà - resultados conforme solicitado.
Você também pode tentar algo como o seguinte se desejar evitar muitas subseleções - e obter todos os dados desejados de uma só vez, por assim dizer.
Resultado:
Vale a pena conhecer as funções de janela , pois são muito poderosas e compensarão qualquer esforço gasto em aprendê-las muitas vezes! A melhor apresentação que eu já vi sobre eles é esta de Bruce Momjian (um membro da equipe principal do PostgreSQL) - é sobre o PostgreSQL, mas os mesmos fundamentos serão aplicados. Outras apresentações dele disponíveis aqui .
Você também pode fazer isso usando uma
APPLY
subconsulta.Observe que
OUTER APPLY
funciona como uma junção à esquerda (em oposição aCROSS APPLY
) e fornecerá a vocêOrders
mesmo que não hajaPayments
nada para isso.db<>violino