我有一个股票代码,所有者和股份数量的表,并希望生成一个查询,显示所有者的总数和百分比。
这是虚拟数据:
+-------+--------+--------+
| 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
,你group by
的ticker
领域在第1列,sum
该shares
领域获得第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
谢谢李 我在MS Access的SQL视图和SQL Developer中尝试了此操作,但无法使其正常工作。我会继续尝试
您在MS Access中收到什么错误?
谢谢!这是用户错误。如果您有任何可扩展方式的想法,我将不胜枚举,因为我大约有15个小组,拥有3至7个所有者
我已经在上面编辑了答案。
李,你真棒。这很有帮助。对此,我真的非常感激。