SQLite如何按列值分隔表?

时间:2018-09-26 19:18:01

标签: python sqlite

我正在用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"])

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

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

编辑:在命令中输入错字

3 个答案:

答案 0 :(得分:1)

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

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部分)

答案 1 :(得分:0)

您可以运行两个查询insert into select ...。 有关如何操作的信息,请参见this SO question

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

答案 2 :(得分:0)

只想告诉你:

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

获得自己拥有的股票,然后shares < 0获得他们已经出售的股票?