MS Access中的查询-总和的百分比

时间:2020-01-31 20:36:19

标签: sql ms-access

我有一个股票代码,所有者和股份数量的表,并希望生成一个查询,显示所有者的总数和百分比。

这是伪数据:

+-------+--------+--------+
| Owner | Ticker | Shares |
+-------+--------+--------+
| Matt  | AAPL   |   2000 |
| Jed   | AAPL   |   8000 |
| Ron   | AAPL   |   4000 |
| Matt  | GE     |   3000 |
| Ron   | GE     |   1000 |
| Jed   | GOOG   |   5000 |
+-------+--------+--------+

这就是我希望的样子:

+--------+--------------+------+------+-----+
| Ticker | Total Shares | Matt | Jed  | Ron |
+--------+--------------+------+------+-----+
| AAPL   |        14000 | 14%  | 57%  | 29% |
| GE     |         4000 | 75%  | 0%   | 25% |
| GOOG   |         5000 | 0%   | 100% | 0%  |
+--------+--------------+------+------+-----+

1 个答案:

答案 0 :(得分:0)

解决此问题的最简单方法是使用条件聚合。

由于您希望得到ticker的结果,因此您group by第1列的ticker字段,sum shares字段以获得第2列,以及然后使用iif语句计算其余各列的所有权百分比:

select
    t.ticker,
    sum(t.shares) as [Total Shares],
    sum(iif(t.owner='Matt',t.shares,0))/sum(t.shares) as Matt,
    sum(iif(t.owner='Jed',t.shares,0))/sum(t.shares) as Jed,
    sum(iif(t.owner='Ron',t.shares,0))/sum(t.shares) as Ron
from
    YourTable t
group by
    t.ticker
order by
    t.ticker

您可以使用格式将十进制结果转换为百分比。

请注意,这种方法无法很好地扩展,因为您将字段值硬编码到查询本身中,但是当将行转换为列时,这种方法是不可避免的,这与大多数RDBMS的操作方式背道而驰。

一种更具可扩展性的方法可能是使用相关的子查询,例如:

select  
    t1.ticker,
    t1.owner, 
    t1.shares/(select sum(t2.shares) from YourTable t2 where t2.ticker = t1.ticker) as pct
from 
    YourTable t1

或查询中的联接,用于计算每个股票的总份额,例如:

select t1.ticker, t1.owner, t1.shares/t2.shares as pct
from
    YourTable t1 inner join
    (
        select t.ticker, sum(t.shares) as shares 
        from YourTable t 
        group by t.ticker
    ) t2
    on t1.ticker = t2.ticker