温馨提示:本文翻译自stackoverflow.com,查看原文请点击:sql - Query in MS Access
ms-access sql

sql - 在MS Access中查询

发布于 2020-04-08 00:05:52

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

这是虚拟数据:

+-------+--------+--------+
| 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%  |
+--------+--------------+------+------+-----+

查看更多

提问者
Gabelli_IT
被浏览
29
Lee Mac 2020-02-04 02:15

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

既然你想要的结果ticker,你group byticker领域在第1列,sumshares领域获得第2列,然后使用iif语句来计算持股比例为每个remainining列:

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