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% |
+--------+--------------+------+------+-----+
解决方案
解决这个问题的最简单方法是使用条件聚合。
由于您想要结果ticker
,因此您需要在第1 列中group by
的字段,获取第 2 列的字段,然后使用语句计算剩余各列的所有权百分比:ticker
sum
shares
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
推荐阅读
- java - 使用 java 和 Vavr 的函数式异常处理的逻辑
- xcode - 警报弹出当前无法正常工作
- php - 表单提交需要两次尝试将信息发送到数据库
- php - TYPO3 Controller Class could not be found. Where do I link it?
- web-hosting - 如何在 Oracle 云中添加我拥有的域并实时托管?
- php - VS Code 无法使用 PHP Intellsense
- ionic-framework - 用命令更新离子?
- opencv - 在制作 ROS 工作区时,没有规则制作目标 libopencv_calib3d.so.3.2.0 但安装了 opencv 3.4.1
- python - 如果测试失败,则停止/失败 docker build
- android - 将位图保存到 PNG 文件随机变黑