1

我有一张桌子,称之为 TEST,就像这样:

+----+--------+
| id | PRCNTG |
+----+--------+
|  1 | 10     | 
|  2 | 20     | 
|  2 | 30     | 
|  3 | 40     | 
|  4 | 50     | 
|  5 | 20     | 
|  5 | 10     | 
|  6 | 20     | 
+----+--------+

在这种情况下,该PRCNTG列总计 200。它不会总是如此。

如果我执行此查询:

SELECT ID, SUM(PRCNTG) FROM TEST GROUP BY ID;

我希望得到以下结果:

+----+--------+
| id | PRCNTG |
+----+--------+
|  1 | 10     | 
|  2 | 50     | 
|  3 | 40     | 
|  4 | 50     | 
|  5 | 30     | 
|  6 | 20     | 
+----+--------+

但是,我实际上想PRCNTG从总数中获取列的百分比。换句话说,我想做这样的事情。

SELECT ID, 100 * (SUM(PRCNTG)/TOTAL(PRCNTG)) FROM TEST GROUP BY ID;

TOTAL()忽略分组的一些理论函数在哪里。所以在这种情况下,它应该总是返回 200。理论上,这将导致如下输出:

+----+--------+
| id | PRCNTG |
+----+--------+
|  1 |  5     | 
|  2 | 25     | 
|  3 | 20     | 
|  4 | 25     | 
|  5 | 15     | 
|  6 | 10     | 
+----+--------+

基本上,我要问的是,是否有办法使用聚合函数并告诉它忽略分组?

简单的解决方法是在不分组的情况下运行相同的查询,只是将SUM()放入一个变量中,然后使用该变量代替TOTAL(PRCNTG),但我希望有一种更优雅的方法来做到这一点。

SELECT @TOTAL = SUM(PRCNTG) FROM TEST;
SELECT ID, 100 * (SUM(PRCNTG)/@TOTAL) FROM TEST GROUP BY ID;
4

1 回答 1

5

你想要一个窗口函数。试试这个:

SELECT ID, 100 * (SUM(PRCNTG)/sum(sum(PRCNTG)) over ())
FROM TEST
GROUP BY ID;

如果要存储PRCNTG为整数,则需要将其转换为某种定点或浮点格式:

SELECT ID, 100 * (SUM(cast(PRCNTG as float))/sum(sum(PRCNTG)) over ())
FROM TEST
GROUP BY ID;
于 2013-04-17T20:46:49.403 回答