获得可供出售的股票

时间:2014-06-11 10:47:10

标签: mysql

到目前为止我所拥有的:http://sqlfiddle.com/#!2/bbfec/6

我希望获得特定股票的数量,特定公司可以出售 - 按价格分组。例如,对于公司编号9和库存编号1,我想要这样的数据:

 | id | name | price |           date        | quantity |  total  |
 ------------------------------------------------------------------
 | 3  | ALTR | 2.240 |  2015-05-12 04:29:29  |    50    |  112.00 |
 | 7  | ALTR | 2.449 |  2014-06-10 18:21:02  |    50    |  122.45 |

因为公司9在2015-05-12 04:29:29购买了200只股票,在2014-06-10 15:50:17卖出100,在2014-06-10 17:06:18卖出50并买入50 on 2014-06-10 18:21:02。

我不想要所有股票的总数,因为当公司收购它们时它们的价格不同。价格和日期是购买价格和日期,但数量是某次购买所剩余的数量。

提前致谢。

草莓,理想的结果:

 | id | price |     date     | quantity |
 -----------------------------------------------
 | 3  | 2.240 |  12-05-2015  |    50    |
 | 7  | 2.449 |  10-06-2014  |    50    |

4 个答案:

答案 0 :(得分:0)

开始于:

select id_acao, id_empresa, ifnull(bought,0) - ifnull(sold,0) as stock
from
(
select id_acao, id_empresa, 
(select sum(quantidade) from acao_trans where tipo='C' and id_acao=a.id_acao and id_empresa=a.id_empresa) as bought,
(select sum(quantidade) from acao_trans where tipo='V' and id_acao=a.id_acao and id_empresa=a.id_empresa) as sold 
from acao_trans a group by id_acao,id_empresa
) x
;
+---------+------------+-------+
| id_acao | id_empresa | stock |
+---------+------------+-------+
|       1 |          4 |  1500 |
|       1 |          9 |   100 |
|       8 |          9 |  3500 |
|      13 |          9 |  5000 |
+---------+------------+-------+

将此查询加入您的基本acao和empresa表。

备注:对于统计数据等,使用负数量来销售交易更容易,而不是交易类型“C”和“V”。

答案 1 :(得分:0)

为了便于(我)理解,我稍微翻译并调整了你的股票表......

SELECT a.stock_id
     , a.company_id
     , a.transaction_date
     , a.price
     , COALESCE(a.quantity - SUM(b.quantity),a.quantity) quantity 
     , COALESCE(a.quantity - SUM(b.quantity),a.quantity) * a.price subtotal
  FROM stock_company a  
  LEFT
  JOIN 
     ( SELECT x.stock_id
     , x.company_id
     , MAX(x.transaction_date) min_transaction_date
     , y.quantity 
  FROM stock_company x 
  JOIN stock_company y 
    ON y.stock_id = x.stock_id 
   AND y.company_id = x.company_id 
   AND y.transaction_date <= x.transaction_date 
   AND y.transaction_type <> x.transaction_type
 WHERE y.transaction_type = 'SELL' 
 GROUP 
    BY x.stock_id
     , x.company_id
     , y.quantity
     ) b 
    ON b.stock_id = a.stock_id 
   AND b.company_id = a.company_id 
   AND b.min_transaction_date = a.transaction_date 
 WHERE a.stock_id = 1 
   AND a.company_id = 9
   AND a.transaction_type = 'BUY'
 GROUP 
    BY stock_id
     , company_id
     , transaction_date;

+----------+------------+---------------------+-------+----------+----------+
| stock_id | company_id | transaction_date    | price | quantity | subtotal |
+----------+------------+---------------------+-------+----------+----------+
|        1 |          9 | 2014-06-10 18:21:02 | 2.449 |       50 |  122.450 |
|        1 |          9 | 2015-05-12 04:29:29 | 2.240 |       50 |  112.000 |
+----------+------------+---------------------+-------+----------+----------+

http://www.sqlfiddle.com/#!2/cfa4d/1

请注意,这还没有经过广泛测试,因此在我的逻辑中可能存在缺陷(或者可能有几个缺陷!),但它似乎在所提供的数据集上运行良好。

编辑:我稍作调整 - 仍不确定是否足够。让我知道。

答案 2 :(得分:0)

也许现在我明白了。怎么样:

select c.id,c.id_empresa,c.id_acao,c.data as c_data,c.quantidade as c_quantidade,v.preco,v.id as v_id,v.data as v_data,ifnull(v.quantidade,0) as v_quantidade, c.preco*v.quantidade as bought, v.preco*v.quantidade as sold
from acao_trans c 
left join acao_trans v 
on c.id=v.parent
order by id_empresa, id_acao,c_data,v_data

导致

+----+------------+---------+---------------------+--------------+-------+------+---------------------+--------------+----------+----------+
| id | id_empresa | id_acao | c_data              | c_quantidade | preco | v_id | v_data              | v_quantidade | bought   | sold     |
+----+------------+---------+---------------------+--------------+-------+------+---------------------+--------------+----------+----------+
|  4 |          4 |       1 | 2014-06-10 08:59:09 |         2000 | 2.385 |    8 | 2014-06-11 10:39:48 |          500 | 1184.000 | 1192.500 |
|  8 |          4 |       1 | 2014-06-11 10:39:48 |          500 |  NULL | NULL | NULL                |            0 |     NULL |     NULL |
|  5 |          9 |       1 | 2014-06-10 15:50:17 |          100 |  NULL | NULL | NULL                |            0 |     NULL |     NULL |
|  6 |          9 |       1 | 2014-06-10 17:06:18 |           50 |  NULL | NULL | NULL                |            0 |     NULL |     NULL |
|  7 |          9 |       1 | 2014-06-10 18:21:02 |           50 |  NULL | NULL | NULL                |            0 |     NULL |     NULL |
|  3 |          9 |       1 | 2015-05-12 04:29:29 |          200 | 2.430 |    5 | 2014-06-10 15:50:17 |          100 |  224.000 |  243.000 |
|  3 |          9 |       1 | 2015-05-12 04:29:29 |          200 | 2.449 |    6 | 2014-06-10 17:06:18 |           50 |  112.000 |  122.450 |
|  2 |          9 |       8 | 2015-05-12 04:27:56 |         3500 |  NULL | NULL | NULL                |            0 |     NULL |     NULL |
|  1 |          9 |      13 | 2015-05-12 04:25:52 |         5000 |  NULL | NULL | NULL                |            0 |     NULL |     NULL |
+----+------------+---------+---------------------+--------------+-------+------+---------------------+--------------+----------+----------+

你可以从那里继续吗?

答案 3 :(得分:0)

好的,现在我想我明白了。 这是查询产生了我想要的内容:

SELECT p.id
   , a.nome
   , p.preco
   , date_format(p.`data`,'%m/%d/%Y') AS `data`
   , COALESCE(p.quantidade-SUM(f.quantidade), p.quantidade) AS quantidade
   , p.preco*COALESCE(p.quantidade-SUM(f.quantidade), p.quantidade) AS total 
   FROM acao_trans p 
   LEFT JOIN acao_trans f 
   ON p.id=f.parent 
   INNER JOIN acao a 
   ON p.id_acao=a.id 
   WHERE p.parent IS NULL 
   AND p.id_acao=1 
   AND p.id_empresa=9 
   GROUP BY p.id

小提琴:http://sqlfiddle.com/#!2/bbfec/64

我做了什么:我加入了重要的表(acao_trans&#34; p&#34;)与自己(&#34; f&#34;)并且我使用Sum函数来聚合第二个参数的所有数量,给我所有已售出股票的总和。如果有&#34; f&#34;我想减去购买股票的总数(&#34; p&#34;)。如果没有对应关系,它将显示空字段,我显示购买数量。完成之后,它很简单。数量在这里真正重要,因为我能够轻松地达到其他目的。