Python函数中的嵌入式SQL(SQLite)提供错误的输出

Posted

技术标签:

【中文标题】Python函数中的嵌入式SQL(SQLite)提供错误的输出【英文标题】:Embedded SQL(SQLite) in Python function delivers wrong output 【发布时间】:2019-02-11 17:19:34 【问题描述】:

我正在尝试获取股票 Mcap 相对于指数 Mcap 总和的百分比权重。

在示例中,仅包含七只股票。我知道 SQL 语句是错误的,我缺少一些概念性的东西。我的结果是扭曲的,我尝试以不同的方式编写 SQL 语句但没有成功。

也许我必须提到,但不确定,我在这里使用的是 SQLite 数据库。所以,如果你能帮助我,请善待并解释概念方面缺少的内容。

def mcap_weight():
    '''Gets the weight of the stock in relation to the Dow Jones Index
    based on Mcap
    - Weight is in percent'''
    path = str(curr_path) + '/DowJonesInvestments.db'
    connection = sqlite3.connect(path)
    cursor = connection.cursor()
    cursor.execute("""
                    SELECT MemberId, Ticker, MemberName,
                    (SELECT COUNT(Mcap/1000000000.0)/(Sum(Mcap/1000000000.0)))*100
                    FROM MarketData
                    LEFT JOIN DowMembers
                    ON MarketData.MarketDataId = DowMembers.MemberId
                    GROUP BY MemberId
                    ORDER by (MemberId);""")
    results = cursor.fetchall()
    cursor.close()
    connection.close()
    return results    

脚本结果:

[(1, 'MMM',  '3M',               0.8889056834224927),
 (2, 'AXP',  'American Express', 1.1358444855147836),
 (3, 'AAPL', 'Apple',            0.12735796496692525),
 (4, 'BA',   'Boeing',           0.4545127533610421),
 (5, 'CAT',  'Caterpillar',      1.2944838109829184),
 (6, 'CVX',  'Chevron',          0.4421289423517639),
 (7, 'CSCO', 'Cisco',            0.46983908340252634)]

xls 的正确结果:

ID Ticker  Mcap             Percentage
1  MMM     114,830,710,459  6.66 
2  AXP     88,040,221,417   5.11
3  AAPL.O  785,188,425,600  45.54
4  BA      220,015,828,512  12.76
5  CAT     77,250,869,537   4.48
6  CVX     226,178,362,059  13.12
7  CSCO.O  212,838,828,298  12.34

Total  1,724,343,245,88

表架构:

**名称数据类型主键默认值** 1. MarkedDataId Integer Yes Null 2. 价格实空 3. Mcap Real Null 4. 分红实空 5.日期日期空

市场数据表:

**MarketDataId 价格 Mcap 股息日期** 1. 1 199.09 112497874482 5.411 2019-01-29 2. 2 103.06 88040221417 1.61 2019-01-29 3. 3 166.52 785188425600 3.07186 2019-01-29 4. 4 387.43 220015828512 7.96029 2019-01-29 5. 5 130.91 77250869537 3.42824 2019-01-29 6. 6 118.37 226178362059 4.67556 2019-01-29 7. 7 47.34 212838828298 1.38477 2019-01-29

【问题讨论】:

显示用于获取这些结果的表中的行。表定义也是。 你的问题只是关于 SQLite3。 Python 无关紧要,因为 Python 不会对可能影响结果正确性的数据进行任何处理。 @shawn 我已经包含了表架构以及 MarketData 表中的数字。也感谢重新格式化的帮助 @ArtOfWarfare 感谢重新格式化 @Xero Smith 感谢重新格式化 【参考方案1】:

我相信你的错误是这样的:

COUNT(Mcap/1000000000.0)

这应该完成什么?使用 Oracle 数据库进行测试(可能与 sqllite 的行为不同)它返回与 Count(Mcap) 相同的内容,我也不认为这是正确的。我认为对于您的第四列,您实际上想要这个:

Mcap/(Select Sum(Mcap) from MarketData)*100

【讨论】:

谢谢@ArtofWarfare,就是这样。完美运行,您提高了我对嵌套查询的理解。

以上是关于Python函数中的嵌入式SQL(SQLite)提供错误的输出的主要内容,如果未能解决你的问题,请参考以下文章

Python读取SQLite文件数据

Python超轻量数据库之SQLite

Python中使用SQLite

python使用sqlite示例

python连接sqlite3

SQLite3 数学函数 Python