我对 SQL 还比较陌生,并且有一面墙。我将 Knex 与 Sqlite 一起使用,我有一个包含所有销售额的表格,其中包含销售额、销售人员和产品类别。我想要一个语句来获取此信息,然后创建另一个列,表示所有销售额的销售额与该类别的销售额之间的百分比差异。
到目前为止,我的工作正常:
const result = await knex('tablename')
.select('salesperson')
.sum('salesvolume')
.select(
knex.raw("sum(CASE category = 'myCategory' THEN salesvolume ELSE 0 END) AS categoryvolume"),
)
.groupBy('salesperson')
.orderBy('salesvolume');
// example of result:
// [
// {
// salesperson: 'Jim A',
// salesvolume: 1000,
// categoryvolume: 400,
// },
// {
// salesperson: 'Sarah B',
// salesvolume: 200,
// categoryvolume: 50,
// }
// ];
在理想的世界中,我可以简单地在我的选择链中添加另一个原始调用,例如:
const result = await knex('tablename')
.select('salesperson')
.sum('salesvolume')
.select(
knex.raw("sum(CASE category = 'myCategory' THEN salevolume ELSE 0 END) AS categoryvolume"),
knex.raw('(sum(categoryvolume) / sum(salesvolume) AS categorypercentage'),
)
.groupBy('salesperson')
.orderBy('salevolume');
// I'm aiming to get:
// [
// {
// salesperson: 'Jim A',
// salesvolume: 1000,
// categoryvolume: 400,
// categorypercentage: .4,
// },
// ];
但这行不通,因为 categoryvolume
是在同一个 select 语句中创建别名的列,无法引用。我还有其他方法可以解决这个问题吗?我觉得我只是没有正确考虑它。
感谢您的任何帮助。