Node.js - 如何使用 sequelize 获取列的总和和平均值?
Node.js - How to get sum and avg of column using sequelize?
在 node.js 中,我想获得具有 STRING
数据类型且值类似于 "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?
我刚刚在 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
}
]
由于您的数据类型是 STRING 并且 SUM
或 AVG
是一个数值函数,因此您首先需要将该列转换为整数。
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强制在列中包含所有数字数据
- 将数据库的架构修改为数字列
在 node.js 中,我想获得具有 STRING
数据类型且值类似于 "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?
我刚刚在 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
}
]
由于您的数据类型是 STRING 并且 SUM
或 AVG
是一个数值函数,因此您首先需要将该列转换为整数。
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强制在列中包含所有数字数据
- 将数据库的架构修改为数字列