web-dev-qa-db-ja.com

結果をグループ化せずにSUM()を使用する

私はすでに (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を使用してここでこれを行うことができますが、明らかにテーブルが大きく、行と列が多くなっていますが、それは重要ではありません。

18
Anonymous
SELECT a.id, b.amount
FROM table1 a
CROSS JOIN
(
    SELECT SUM(amount) amount FROM table1
) b

テーブル内のすべての行の合計の値の デカルト結合 を各idに対して実行する必要があります。副選択の結果は1つしかないため(49)、基本的には各idに追加されます。

13
Zane Bien

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

enter image description here

---パーティション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

enter image description here

9
Valentin Petkov

元のテーブルをサブクエリで合計に結合します。

SELECT * FROM table1, (SELECT SUM(amount) FROM table1 AS amount) t
5
Jon

これはsum()クエリを1つだけ実行するので、正常に実行されます。

SELECT a.id, b.amount
FROM table1 a
cross join (SELECT SUM(amount) as amount FROM table1 AS amount) b
0
Bohemian