我有两张表(订单,付款)它们是一对多关系(1:N)一个订单可以有很多付款
表 1:订单
ID | 总价 |
---|---|
1 | 1000 |
2 | 2000 |
3 | 3000 |
表 2:付款
order_id(订单的FK) | 支付金额 |
---|---|
1 | 500 |
2 | 2000 |
3 | 1000 |
3 | 500 |
3 | 750 |
有些订单没有完全支付,所以我想得到
1- 每个订单支付的其余部分 .. 喜欢:
命令 | 已付余款 |
---|---|
1 | 500 |
3 | 750 |
2- 其余所有订单的总和 Like: 1250
谢谢。
为了解决您的问题,我执行了以下操作(下面的所有代码都可以在此处的小提琴中找到):
填充:
我使用
_order
表名而不是orders
因为我不喜欢复数表名 - 表是一个集合,应该有一个单数名称。它可能包含 0、1 或许多记录 - 不一定很多。我还使用snake_case 作为表名。这些只是个人的事情 - 选择一个约定并坚持下去!然后:
和:
并运行以下 SQL:
结果:
我在那里留下了额外的字段,以便您可以看到发生了什么。我们可以按如下方式清理它以获得您想要的结果:
结果:
为了获得每个订单的欠款总额,我们执行以下操作:
结果:
Et voilà - 按要求提供结果。
如果您希望避免过多的子选择,您可能还想尝试以下类似的方法 - 并且您可以一口气获得所有所需的数据。
结果:
窗口函数非常值得了解,因为它们非常强大,并且会回报您多次学习它们所付出的任何努力!我见过的关于它们的最好的介绍是Bruce Momjian(PostgreSQL 核心团队成员)的这个——它是关于 PostgreSQL 的,但同样的基础知识也适用。他的其他演讲可以在这里找到。
您也可以使用
APPLY
子查询来执行此操作。请注意,它的
OUTER APPLY
工作方式类似于左连接(而不是),即使根本没有它CROSS APPLY
也会给你。Orders
Payments
db<>小提琴