Eri*_*len 1 sql t-sql aggregate
我有一张桌子,叫它 TEST,就像这样:
+----+--------+
| id | PRCNTG |
+----+--------+
| 1 | 10 |
| 2 | 20 |
| 2 | 30 |
| 3 | 40 |
| 4 | 50 |
| 5 | 20 |
| 5 | 10 |
| 6 | 20 |
+----+--------+
Run Code Online (Sandbox Code Playgroud)
PRCNTG在本例中,该列总计 200。它不会总是如此。
如果我执行此查询:
SELECT ID, SUM(PRCNTG) FROM TEST GROUP BY ID;
Run Code Online (Sandbox Code Playgroud)
我希望得到以下结果:
+----+--------+
| id | PRCNTG |
+----+--------+
| 1 | 10 |
| 2 | 50 |
| 3 | 40 |
| 4 | 50 |
| 5 | 30 |
| 6 | 20 |
+----+--------+
Run Code Online (Sandbox Code Playgroud)
但是,我实际上想PRCNTG从总数中获取列的百分比。换句话说,我想做这样的事情。
SELECT ID, 100 * (SUM(PRCNTG)/TOTAL(PRCNTG)) FROM TEST GROUP BY ID;
Run Code Online (Sandbox Code Playgroud)
哪里TOTAL()有一些忽略分组的理论函数。所以在这种情况下,它应该总是返回 200。理论上,这会导致这样的输出:
+----+--------+
| id | PRCNTG |
+----+--------+
| 1 | 5 |
| 2 | 25 |
| 3 | 20 |
| 4 | 25 |
| 5 | 15 |
| 6 | 10 |
+----+--------+
Run Code Online (Sandbox Code Playgroud)
基本上,我要问的是,是否有办法使用聚合函数并告诉它忽略分组?
简单的解决方法是在不分组的情况下运行相同的查询,只是为了将SUM()放入一个变量中,然后使用该变量代替TOTAL(PRCNTG),但我希望有一种更优雅的方法来做到这一点。
SELECT @TOTAL = SUM(PRCNTG) FROM TEST;
SELECT ID, 100 * (SUM(PRCNTG)/@TOTAL) FROM TEST GROUP BY ID;
Run Code Online (Sandbox Code Playgroud)
你想要一个窗口函数。尝试这个:
SELECT ID, 100 * (SUM(PRCNTG)/sum(sum(PRCNTG)) over ())
FROM TEST
GROUP BY ID;
Run Code Online (Sandbox Code Playgroud)
如果您存储PRCNTG为整数,那么您需要将其转换为某种固定或浮点格式:
SELECT ID, 100 * (SUM(cast(PRCNTG as float))/sum(sum(PRCNTG)) over ())
FROM TEST
GROUP BY ID;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1782 次 |
| 最近记录: |