使用 Knex/Sqlite 在同一个 select 语句中引用别名列

时间:2021-01-08 17:11:27

标签: node.js sqlite knex.js

我对 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 语句中创建别名的列,无法引用。我还有其他方法可以解决这个问题吗?我觉得我只是没有正确考虑它。

感谢您的任何帮助。

0 个答案:

没有答案
相关问题