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 に答える