【问题标题】:Node.js - How to get sum and avg of column using sequelize?Node.js - 如何使用 sequelize 获取列的总和和平均值?
【发布时间】:2022-01-17 17:51:41
【问题描述】:

在 node.js 中,我想得到一列的总和,该列具有STRING dataType 并且值类似于"367793582429824"

我只是尝试如下所述,但它抛出了一个错误,如SequelizeDatabaseError: column "assetamount" does not exist

[
 sequelize.fn("sum", sequelize.col("assetAmount")), "totalAssetAmount",
],

型号是,

module.exports = (sequelize, DataTypes) => {
 const items = sequelize.define("Items", {
  id: {
    allowNull: false,
    type: DataTypes.UUID,
    primaryKey: true,
    autoIncrement: true,
  },
  assetAmount: {
    type: Sequelize.STRING,
    allowNull: false,
  },
  createdAt: {
    allowNull: false,
    type: Sequelize.DATE,
  },
  updatedAt: {
    type: Sequelize.DATE,
    allowNull: false,
  },
 });
};

另外我想计算该列的平均值,如何获得该列的 SUM 和 AVG?

【问题讨论】:

  • 你能分享你的模型架构吗
  • 更新@MuhammadFazeel

标签: node.js postgresql sum sequelize.js average


【解决方案1】:

由于您的数据类型为 STRING 且 SUMAVG 是一个数值函数,因此您首先需要将该列转换为整数。

const { Sequelize } = require('sequelize')
let resp = await model.Item.findAll({
  attributes: [
    [Sequelize.fn("SUM", Sequelize.cast(Sequelize.col("assetAmount"), 'integer')), "totalAssetAmount"], 
    [Sequelize.fn('AVG', Sequelize.cast(Sequelize.col('assetAmount'), 'integer')), 'avgAssetAmount']
  ]
});

** 请注意,如果列中有非数字数据,则此 SQL 将失败。 例如,如果你有 1 行 assetAmount = 'hello',那么这个 SQL 将引发异常

一些缓解措施:

  • 使用where 选项过滤掉所有非数字行。
  • 使用validate 强制在列中包含所有数字数据
  • 将数据库的架构修改为数字列

【讨论】:

  • 获取SequelizeDatabaseError: integer out of range
  • 这意味着您的值超出了整数可以容纳的范围(-2,147,483,648 到 2,147,483,647)。试试'bigint' 而不是'integer' 看看。
【解决方案2】:

我刚刚在 squelize 中创建了与 urs 相同的 shema 并运行查询以获取总和和平均值,你可以使用此代码在我的最后工作..

"use strict";
module.exports = (sequelize, DataTypes) => {
    var Item = sequelize.define(
        "Item",
        {
            assetAmount: {
                type: DataTypes.STRING,
                allowNull: false,
            },
        },
        {
            freezeTableName: true,
        }
    );
    return Item;
};

数据库数据

这是我对 sum 和 avg 的查询

        let resp = await model.Item.findAll({
            attributes: [[
                model.sequelize.fn("sum", model.sequelize.col("assetAmount")), "totalAssetAmount",
            ], [model.sequelize.fn('AVG', model.sequelize.col('assetAmount')), 'avgRating']]
        });
console.log(resp)

这是您需要的回复

[
    {
        "totalAssetAmount": 1469134,
        "avgRating": 734567
    }
]

【讨论】:

  • 我收到SequelizeDatabaseError: function sum(character varying) does not exist
  • 表示将数字存储在数字字段中,可以是整数、小数或其他任何值。但不在 text/varchar 字段中。
  • 我已经解决了这个问题,但现在我收到了SequelizeDatabaseError: column "Item.assetAmount" must appear in the GROUP BY clause or be used in an aggregate function
猜你喜欢
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多