【问题标题】:Is it possible to get an average integer value from string data from a database?是否可以从数据库中的字符串数据中获取平均整数值?
【发布时间】:2019-01-29 11:24:10
【问题描述】:

我编写了一个烧瓶应用程序,它获取用户的身高、眼睛颜色和电子邮件地址,并将数据保存到 postgresql 数据库,然后通过电子邮件向用户发送他们提供给我的数据。我想设置它,以便用户收到一封电子邮件,其中包含平均人数的身高和眼睛颜色。

目前我将高度设置为整数值,将眼睛颜色设置为字符串值。

测试这个我收到了这个错误信息:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) 函数 avg(字符变化)不存在第 1 行:SELECT avg(data.color_) AS avg_1 ^ 提示:没有函数与给定名称匹配 和参数类型。您可能需要添加显式类型转换。 [SQL: 'SELECT avg(data.color_) AS avg_1 \nFROM data'] (背景 错误:http://sqlalche.me/e/f405)

我相信这是因为我试图从 str 获取 int 数据。有没有办法做到这一点?假设有 4 个人填写了这张表格,并且所有 4 个人都说他们有“蓝色”的眼睛。有没有办法让程序将 100% 的平均值发送给他们?

我的代码如下:

class Data(db.Model):
    __tablename__="data"
    id=db.Column(db.Integer,primary_key=True)
    email_=db.Column(db.String(120), unique=True)
    height_=db.Column(db.Integer)
    color_=db.Column(db.String(6))

@app.route("/success", methods=['POST'])
def success():
    if request.method=='POST':
        email=request.form["email_name"]
        height=request.form["height_name"]
        color=request.form["color_name"]
        send_email(email, height, color)
        if db.session.query(Data).filter(Data.email_==email).count() == 0:
            data=Data(email,height,color)
            db.session.add(data)
            db.session.commit()
            average_height = db.session.query(func.avg(Data.height_)).scalar()
            average_color = db.session.query(func.avg(Data.color_)).scalar()
            print(average_height)
            print(average_color)
            return render_template("success.html")

【问题讨论】:

  • 你不能有平均的字符串和眼睛的颜色。但是您可以显示用户和蓝眼睛的百分比。
  • @Ubercool 啊是的,显示百分比可能会更好。有没有办法从桌子本身做到这一点?就像,我能否计算“color_name”出现在表中的次数,然后将其除以列数,然后乘以 100?对不起,如果这个问题看起来很愚蠢,我对数据库比较陌生。

标签: python postgresql flask-sqlalchemy


【解决方案1】:

这是一个你可以参考的例子:

考虑user_data 具有两列nameeye_color 的表

SELECT eye_color, count(*) AS user_count,
       COUNT(*) * 100.0/ SUM(COUNT(*)) OVER() as percent
FROM user_data
GROUP BY eye_color;

此查询将为您提供拥有每只彩色眼睛的用户的数量和百分比。 请参考this fiddle 玩。 您需要找到一种方法来让这个查询适合您的 Python 应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2015-10-15
    • 2022-07-21
    • 2013-06-08
    相关资源
    最近更新 更多