我在 Azure SQL DB 中有下表,其中包含我试图求和的重复值。
逻辑如下:如果 PaymentID 唯一,则 Sum Payment,如果 creditID 唯一,则 sum credit,如果 debitid 唯一,则 sum debit。并采用 max(source) 这个想法是得到一个单行,每个 ID 具有不同的 ID 总和值。
ID | 支付 | 信用 | 借方 | 资源 | 付款ID | 信用证 | 借方 |
---|---|---|---|---|---|---|---|
1510142123 | -589.53 | 0 | 0 | 抄送 | 5831879 | 无效的 | 无效的 |
1510142123 | -589.53 | 0 | 0 | 抄送 | 5831882 | 无效的 | 无效的 |
1510142123 | -155.06 | 0 | 0 | 抄送 | 5898896 | 无效的 | 无效的 |
157771145 | -126.42 | 0 | 0 | 抄送 | 5885900 | 无效的 | 无效的 |
157771145 | -58.73 | 0 | 0 | 抄送 | 5885903 | 无效的 | 无效的 |
158088837 | -55.14 | 0 | -3.45 | 抄送 | 5897306 | 无效的 | 5897303 |
158088837 | -5.75 | 0 | -3.45 | 抄送 | 5897309 | 无效的 | 5897303 |
158464166 | -161 | 0 | -3.45 | 抄送 | 5910551 | 无效的 | 5910548 |
158464166 | -24.15 | 0 | -3.45 | 抄送 | 5910554 | 无效的 | 5910548 |
1591970734 | -111.61 | 0 | 0 | 银行 | 5939648 | 无效的 | 无效的 |
1591970734 | -0.01 | 0 | 0 | 现金 | 5939711 | 无效的 | 无效的 |
1591970734 | -0.01 | 0 | 0 | 现金 | 5939714 | 无效的 | 无效的 |
159297565 | -708.93 | 20 | 0 | 抄送 | 5943728 | 5910848 | 无效的 |
159297565 | -0.02 | 20 | 0 | 现金 | 5948207 | 5910848 | 无效的 |
例如:
158464166 | -185.15 | 0 | -3.45 | 抄送 | 5910551 | 5910548
(在上面 - 我已经采取了 min(paymentid) 让它看起来更好
请注意,虽然在上面的代码片段中,Creditid 和 Debitid 只有一个重复的 ID,但它们可能有不同的 ID,因此任何代码都必须能够处理它。PaymentID 将始终是唯一的。
付款、贷记和借记的值也可能不是唯一的(例如,一个 ID 支付了两次 50 美元),因此我们不能对付款进行分组。
我做到了这一点:
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
但它没有给出预期的结果。
对于您发布预期结果的一行,这将返回您想要的。
将来,请将您的表格作为插入脚本发布,以便更容易使用。
您可以使用 FIRST_VALUE 窗口函数获得类似的结果
PostgreSQL 的类似查询