我有一个股票代码,所有者和股份数量的表,并希望生成一个查询,显示所有者的总数和百分比。
这是伪数据:
+-------+--------+--------+
| 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% |
+--------+--------------+------+------+-----+
答案 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