【发布时间】:2014-03-04 23:29:31
【问题描述】:
这个很棘手。
Finance 表的 SecurityID、FundID 和 Value 已按 FundID 分组,并在每个 FundID 内排名/排序
它可能看起来像这样(想象数百或记录):
+------+------------+--------+-------+
| Rank | SecurityID | FundID | Value |
+------+------------+--------+-------+
| 1 | 23 | A | 5 |
| 2 | 43 | A | 4 |
| 3 | 44 | A | 3 |
| 1 | 72 | B | 8 |
| 2 | 75 | B | 7 |
| 3 | 76 | B | 2 |
| 1 | 83 | C | 5 |
+------+------------+--------+-------+
目标是在每种基金类型中获得前 20% 的证券。然后从那 20% 中得到值的总和。例如,如果基金类型 A 中有 10 只证券,那么我想将前 2 条记录的值相加。答案是 9。
SQL 可能如下所示:
SELECT SUM(Value) as TopTwenty, FundID
FROM @FinanceTable
WHERE Rank <= ((SELECT COUNT(*)
FROM @FinanceTable WHERE FundID = 1) * .20)
GROUP BY FundID
上面的查询适用于 FundID = 1。但是,我不想指定“Where FundID = 1”。相反,我希望它为所有 FundID 运行此查询。这是我被难住的部分。我想我可以使用游标来做到这一点。但是有没有办法在没有光标的情况下做到这一点?
谢谢!
【问题讨论】:
-
你能改进一下标题吗?我怀疑有人会搜索“棘手的 SQL Server 查询”。他们可能会搜索“在 SQL Server 中获取行的百分比并对它们的值求和”之类的。
标签: sql sql-server sql-server-2008 tsql