【问题标题】:SQLite How do I separate a table by column values?SQLite 如何按列值分隔表?
【发布时间】:2018-09-26 19:18:00
【问题描述】:

我正在使用 Flask 编写一个简单的股票交易网站,同时学习如何使用 SQLite 数据库。当登录用户进行交易(买/卖)时,我使用以下命令将其插入transactions 数据库:

db.execute("INSERT INTO transactions (user_id, symbol, shares, price) VALUES (:user_id, :symbol, :shares, :price)",
           user_id=session["user_id"], symbol=symbol, shares=shares, price=price)

如果用户想查看他们目前有哪些股票,我只是从数据库中查询:

trades = db.execute("SELECT * FROM transactions WHERE user_id = :user_id ORDER BY transaction_id ASC",
                    user_id=session["user_id"])

但这让我恢复了买卖的所有交易。我设置的方式是,当用户卖出股票时,shares 列将为负数。在这一点上,我在代码中组织数据变得非常混乱。但我不确定是否应该添加另一个数据库,因为我还必须在我的代码中单独插入和查询该数据库。

是否有一个命令可以让我将买卖交易分成两个单独的表?

编辑:命令中的错字

【问题讨论】:

  • 你不能只调用 2 次数据库调用吗?

标签: python sqlite


【解决方案1】:

如果您只想显示买单,您只需要通过获取shares 为正数的所有行来过滤select 查询

trades = db.execute("
    SELECT * FROM transactions 
    WHERE user_id = :user_id AND shares > 0 
    ORDER BY transaction_id ASC",
    user_id=session["user_id"]
)

但是,如果您想显示每个股票/交易品种的总持有量,您可以使用group by 子句并对shares 列求和。

holdings = db.execute("
    SELECT id, symbol, SUM(shares) 
    FROM transactions 
    WHERE user_id = :user_id
        AND SUM(shares) > 0 -- Edit: Added this so it will only show stocks you own
    GROUP BY symbol 
    ORDER BY transaction_id ASC",
    user_id=session["user_id"]
)

旁注:我认为id 在您的第二个select 查询中是错误的,您的意思是user_id(在WHERE id = :user_id 部分中)。

【讨论】:

  • 你是对的。我在查看我的 IDE 时在这个问题中输入了我的代码,所以我没有发现那个错误。
  • 谢谢,这很好用。我害怕不得不创建另一个数据库。
  • 没问题 :) 很高兴为您提供帮助
【解决方案2】:

您可以运行两个查询insert into select ...。 请参阅this SO question 了解如何操作。

您只需要为卖出交易运行第一个,为买入交易运行另一个。

【讨论】:

    【解决方案3】:

    你不能:

    SELECT * FROM transactions WHERE id = :user_id and shares > 0 ORDER BY transaction_id ASC
    

    获得他们拥有的股份,然后shares < 0 获得他们已售出的股份?

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多