我试图得到一只股票的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是Null2.实际价格为零3.Mcap Real Null4.股息实零5.日期空
市场数据表:
**MarketDataId价格Mcap股息日期**1.1 199.09 112497874482 5.411 2019-01-292.2 103.06 88040221417 1.61 2019-01-293.3 166.52 785188425600 3.07186 2019-01-294.4 387.43 220015828512 7.96029 2019-01-295.5 130.91 77250869537 3.42824 2019-01-296.6 118.37 226178362059 4.67556 2019-01-297.7 47.34 212838828298 1.38477 2019-01-29
我相信你的错误是:
COUNT(Mcap/1000000000.0)
这应该实现什么?使用Oracle数据库进行测试(可能与sqllite的行为不同),它返回的内容与Count(Mcap)
相同,我也认为这不是正确的做法。我认为对于你的第四个专栏,你实际上想要这个:
Mcap/(Select Sum(Mcap) from MarketData)*100