首页 > 解决方案 > 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%  |
+--------+--------------+------+------+-----+

标签: sqlms-access

解决方案


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

由于您想要结果ticker,因此您需要在第1 列中group by的字段,获取第 2 列的字段,然后使用语句计算剩余各列的所有权百分比:tickersumsharesiif

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

推荐阅读