0

我是 MySQL 新手,需要帮助我想做的事情。我有 3 张桌子eod-stock和. 表格包含在证券交易所上市的公司的所有数据,代码由证券交易所指定。有一天中每分钟交易的数据,它也有相同的 company_code 字段。有股数等数据。我想要的总结如下:companyshare_percentagecompanyeod_stockshare_percentage

第 1 步:将表中的 company_code 字段与eod_stock表中的代码字段匹配company。字段的值相同(为公司分配的代号)。

第二步:按字段排序sector_id。该字段在company表中。这些行业都有独特的不同ID,并且它们下有公司(有点像类别子类别。行业ID是类别,属于特定行业的公司将归入该类别)

第 3 步:根据last_trade_price(in eod_stocktable) 字段和datetime(last)对第 2 步中的公司进行排序

第 4 步share_percentage:通过 company_code 字段匹配表中 no_of_shares的公司

step35步:乘以 step4

第 6 步:第 5 步的总和(按部门划分的公司总和。例如,所有银行的总和)

第 7 步step 5除以step 6

第 8 步:按部门计算第 7 步的总和(例如:所有银行)= 结果

我希望我的解释足够详细。我无法让它工作。任何帮助深表感谢。提前致谢!

表样本和我想要的:

TABLE company:

code: "google", "HSBC", "yahoo", "SCB"
sector_id: "1" ,"2", "1", "2"

TABLE eod_stock:
company_code : "google", "HSBC", "yahoo", "SCB"
ltp: "110", "115.2", "122.4", 105"
datetime: "1/1/2014 11:00", "1/1/2014 11:00", "1/1/2014 11:00", "1/1/2014 11:00"

company_code : "google", "HSBC", "yahoo", "SCB"
ltp: "112", "108.2", "112.4", 105.80"
datetime: "1/1/2014 11:01", "1/1/2014 11:01", "1/1/2014 11:01", "1/1/2014 11:01"

TABLE : share_percentage
company_code: "google", "HSBC", "yahoo", "SCB"
total_share: "12000", "20000", "5000", "18000"

和我的代码:

 SELECT company.sector_id, 
   SUM(eod_stock.ltp * share_percentage.total_share) AS Market_CAP
  FROM company
  INNER JOIN (SELECT max(datetime) as lastTime,company_code
  FROM eod_stock
  GROUP BY company_code) as LAST_TRADE
  ON LAST_TRADE.company_code = company.code
  INNER JOIN eod_stock on eod_stock.datetime = Last_trade.lastTime 
                 and eod_stock.company_code = company.code 
  INNER JOIN share_percentage on share_percentage.company_code = company.code
  GROUP BY company.sector_id;

我知道我的 sql 不行,但我想要达到的最终结果是 8.3。我知道我可以通过中断操作使用 php 对其进行编码,但如果可以节省时间,我想从 sql 中实现它。

4

2 回答 2

1
SELECT company.sector_id, sum(stock.ltp*share_percentage.total_shares)
FROM company, share_percentage, (
    SELECT eod_stock.company_code, eod_stock.ltp 
    FROM eod_stock
    INNER JOIN (
        select eod_stock.company_code, max(datetime) last 
        from eod_stock
        group by eod_stock.company_code
    ) as last
    on (eod_stock.company_code = last.company_code and eod_stock.datetime = last.last )
) as stock
WHERE company.code = stock.company_code and company.code=share_percentage.company_code

使用这个,更快更简单

于 2014-01-01T17:02:23.117 回答
0

看起来您正在尝试在一天结束时计算每个行业的市值。如果是这样,下面的查询应该这样做。

SELECT COMPANY.SECTOR_ID, 
   SUM(eod_stoc.ltp * share_percentage.total_shares) AS Market_CAP
FROM COMPANY
INNER JOIN (
    SELECT max(datetime) lastTime
       ,company_code
    FROM eod_stock
   GROUP BY company_code
) LAST_TRADE
ON Last_trade.company_code = company.company_code
INNER JOIN eod_stock on eod_stock.datetime = Last_trade.lasttime 
                     and eod_stock.company_code = company.company_code 
INNER JOIN share_percentage on share_percentage.company_code = company.company_code
GROUP BY COMPANY.SECTOR_ID;
于 2013-12-31T20:26:22.690 回答