私はすでに (this) を読みましたが、それを私の特定の問題に実装する方法を理解できませんでした。私はSUM()
が集約関数であり、そのように使用しないのは意味がないことを知っていますが、この特定のケースでは、すべてを維持しながらすべての結果をSUM()
する必要があります単一行。
これがテーブルです:
_--ID-- --amount--
1 23
2 11
3 8
4 7
_
量をSUM()
する必要がありますが、すべてのレコードを保持するため、出力は次のようになります。
_--ID-- --amount--
1 49
2 49
3 49
4 49
_
このクエリはありましたが、すべての結果を合計するのではなく、各行のみを合計します。
_SELECT
a.id,
SUM(b.amount)
FROM table1 as a
JOIN table1 as b ON a.id = b.id
GROUP BY id
_
SUM()
がないと、1行しか返されませんが、すべてのIDを維持する必要があります...
注:はい、これはかなり基本的な例であり、phpを使用してここでこれを行うことができますが、明らかにテーブルが大きく、行と列が多くなっていますが、それは重要ではありません。
SELECT a.id, b.amount
FROM table1 a
CROSS JOIN
(
SELECT SUM(amount) amount FROM table1
) b
テーブル内のすべての行の合計の値の デカルト結合 を各id
に対して実行する必要があります。副選択の結果は1つしかないため(49
)、基本的には各id
に追加されます。
mS SQLではOVER()を使用できます
select id, SUM(amount) OVER()
from table1
select id, SUM(amount) OVER()
from (
select 1 as id, 23 as amount
union all
select 2 as id, 11 as amount
union all
select 3 as id, 8 as amount
union all
select 4 as id, 7 as amount
) A
---パーティションIDのオーバー
PARTITION BYは、たとえばMONTHごとにSUM()を実行したい場合、または四半期ごとのレポートの売上または年間を実行したい場合に非常に便利です...
select distinct id, SUM(amount) OVER(PARTITION BY id) as [SUM_forPARTITION]
from (
select 1 as id, 23 as amount
union all
select 1 as id, 23 as amount
union all
select 2 as id, 11 as amount
union all
select 2 as id, 11 as amount
union all
select 3 as id, 8 as amount
union all
select 4 as id, 7 as amount
) OverPARTITIONID
元のテーブルをサブクエリで合計に結合します。
SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t
これはsum()
クエリを1つだけ実行するので、正常に実行されます。
SELECT a.id, b.amount
FROM table1 a
cross join (SELECT SUM(amount) as amount FROM table1 AS amount) b