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)提供错误的输出的主要内容,如果未能解决你的问题,请参考以下文章