postgresql - Knex.js for PostgreSQL 中具有不同 WHERE 子句的完全外连接
问题描述
我尝试获得一个包含两列显示聚合结果的单行:一列应显示基于一个 WHERE 子句的总和,而另一列应显示基于不同 WHERE 子句的总和。
期望的输出:
amount_vic amount_qld
100 70
在原始PostgreSQL中,我可以写这样的东西:
select
sum(a.amount) as amount_vic,
sum(b.amount) as amount_qld
from mytable a
full outer join mytable b on 1=1
where a.state='vic' and b.state= 'qld'
问题:如何在knex.js中编写返回所需结果的此查询或类似查询?例如:'on 1=1' 可能需要 knex.raw() 并且我认为表和列别名对我不起作用,它总是返回一些错误。
我在 knex.js 中的不工作尝试之一:
knex
.sum({ amount_vic: 'a.amount' })
.sum({ amount_qld: 'b.amount' })
.from('mytable')
.as('a')
.raw('full outer join mytable on 1=1')
.as('b')
.where({
a.state: 'vic',
b.state: 'qld'
})
谢谢您的帮助。
解决方案
免责声明:这不能回答问题的 Knex 部分 - 但评论太长了。
尽管您当前的查询可以满足您的要求,但它的措辞方式似乎并不理想。这里不需要生成自笛卡尔积 - 这就是这样full join ... on 1 = 1
做的。您可以只使用条件聚合。
在 Postgres 中,您可以将其表述为:
select
sum(amount) filter(where state = 'vic') amount_vic,
sum(amount) filter(where state = 'qld') amount_qld
from mytable
where state in ('vic', 'qld')
我不知道 Knex,所以我不知道如何将查询翻译成它。也许这个查询对您来说更容易翻译。
推荐阅读
- asp.net-core - 没有为 Vue.Js + ASP.Net Core MVC 应用程序加载 Vue 组件
- python - 如何通过tensorflow将多个学习数据输入model.fit()
- r - R 中的 Memory.limit 与 memory.size
- javascript - 如何在nodejs中列出路径文件名
- bluetooth-lowenergy - 如何修改 BLE gatt 服务器配置文件
- firebase - Firebase - 上传 APNs 身份验证密钥时出现错误“没有为此应用存储团队 ID”
- javascript - react-redux:动作不会改变商店
- azure - GitHub、Git-LFS 和 Azure
- vue.js - Vue 3:将 id 属性与变量绑定,带有部分自定义文本
- command - 我的 nuke 命令按预期工作 discord.js