Eu tenho a seguinte tabela, em um banco de dados SQL do Azure que tem valores duplicados que estou tentando somar.
Aqui está a lógica: Se o PaymentID for único, então Sum Payment, se o creditID for único, então somar crédito, se o debitid for único, então somar débito. E pegue o max(source) A ideia é pegar uma única linha, por ID com valores distintos para o ID somado.
Eu iria | Forma de pagamento | crédito | débito | Fonte | id de pagamento | crédito | débito |
---|---|---|---|---|---|---|---|
1510142123 | -589,53 | 0 | 0 | CC | 5831879 | NULO | NULO |
1510142123 | -589,53 | 0 | 0 | CC | 5831882 | NULO | NULO |
1510142123 | -155,06 | 0 | 0 | CC | 5898896 | NULO | NULO |
157771145 | -126,42 | 0 | 0 | CC | 5885900 | NULO | NULO |
157771145 | -58,73 | 0 | 0 | CC | 5885903 | NULO | NULO |
158088837 | -55,14 | 0 | -3,45 | CC | 5897306 | NULO | 5897303 |
158088837 | -5,75 | 0 | -3,45 | CC | 5897309 | NULO | 5897303 |
158464166 | -161 | 0 | -3,45 | CC | 5910551 | NULO | 5910548 |
158464166 | -24,15 | 0 | -3,45 | CC | 5910554 | NULO | 5910548 |
1591970734 | -111,61 | 0 | 0 | Banco | 5939648 | NULO | NULO |
1591970734 | -0,01 | 0 | 0 | Dinheiro | 5939711 | NULO | NULO |
1591970734 | -0,01 | 0 | 0 | Dinheiro | 5939714 | NULO | NULO |
159297565 | -708,93 | 20 | 0 | CC | 5943728 | 5910848 | NULO |
159297565 | -0,02 | 20 | 0 | Dinheiro | 5948207 | 5910848 | NULO |
Por exemplo:
158464166 | -185,15 | 0 | -3,45 | CC | 5910551 | 5910548
(no acima - eu peguei o min(paymentid) para torná-lo mais bonito
Observe que, embora no snippet acima, Creditid e Debitid tenham apenas um ID duplicado, é possível que eles tenham IDs distintos, portanto, qualquer código terá que lidar com isso. PaymentID será sempre único.
Também é possível que os valores para pagamento, crédito e débito não sejam únicos (por exemplo, um pagamento de $ 50 é feito duas vezes para um único ID), então não podemos agrupar no pagamento.
cheguei até aqui:
SELECT id, sum(payment), sum(credit), sum(debit), max(source), creditid, debitid
FROM (
SELECT *,
COUNT(*) OVER (PARTITION BY id) AS cnt
FROM Temp_Payment) AS t
WHERE t.cnt > 1
group by id, creditid, debitid
mas não está dando o resultado esperado.
Para a linha para a qual você postou os resultados esperados, isso retornará o que você deseja.
No futuro, poste sua tabela como um script de inserção para que seja mais fácil trabalhar com ela.
Você pode obter um resultado semelhante usando a função de janela FIRST_VALUE
A consulta semelhante para PostgreSQL