web-dev-qa-db-ja.com

同じクエリでgroup byおよびover(partition by)を使用できませんか?

3列のテーブルmyTableがあります。 _col_1_はINTEGERであり、他の2つの列はDOUBLEです。たとえば、_col_1={1, 2}, col_2={0.1, 0.2, 0.3}_。 _col_1_の各要素は_col_2_のすべての値で構成され、_col_2_には_col_1_の各要素の値が繰り返されます。 3番目の列には、次のように任意の値を指定できます。

_    col_1 | col_2 | Value
    ----------------------
    1     |  0.1  |  1.0
    1     |  0.2  |  2.0
    1     |  0.2  |  3.0
    1     |  0.3  |  4.0
    1     |  0.3  |  5.0
    2     |  0.1  |  6.0
    2     |  0.1  |  7.0
    2     |  0.1  |  8.0
    2     |  0.2  |  9.0
    2     |  0.3  |  10.0
_

私が欲しいのは、Value列パーティションで_col_1_で、_col_2_でグループ化された集約関数SUM()を使用することです。上記の表は次のようになります。

_    col_1 | col_2 | sum_value
    ----------------------
    1     |  0.1  |  1.0
    1     |  0.2  |  5.0
    1     |  0.3  |  9.0
    2     |  0.1  |  21.0
    2     |  0.2  |  9.0
    2     |  0.3  |  10.0
_

次のSQLクエリを試しました。

_SELECT col_1, col_2, sum(Value) over(partition by col_1) as sum_value
from myTable
GROUP BY col_1, col_2
_

しかし、DB2 v10.5では、次のエラーが発生しました。

_SQL0119N  An expression starting with "Value" specified in a SELECT 
clause, HAVING clause, or ORDER BY clause is not specified in the 
GROUP BY clause or it is in a SELECT clause, HAVING clause, or ORDER 
BY clause with a column function and no GROUP BY clause is specified.
_

何がおかしいのか教えてください。 SQLの経験はあまりありません。

ありがとうございました。

13
user3557405

私は解決策を見つけました。

OVER(PARTITION BY col_1)を使用する必要はありません。既にGROUP BY句。したがって、次のクエリでは正しい答えが得られます。

SELECT col_1, col_2, sum(Value) as sum_value
from myTable GROUP BY col_1, col_2

私はすでにw.r.t col_1およびcol_2

デイブ、ありがとう、あなたの投稿からアイデアを得た。

7
user3557405

はい、できますが、グループ化レベルに関して一貫性を保つ必要があります。つまり、クエリがGROUP BYクエリの場合、分析関数では、選択した列の「非分析」部分の「詳細」列のみを使用できます。したがって、次の例のように、GROUP BY列または非分析集計のいずれかを使用できます。

select product_id, company, 
sum(members) as No_of_Members, 
sum(sum(members)) over(partition by company) as TotalMembership 
From Product_Membership 
Group by Product_ID, Company

役立つことを願っています

SELECT col_1, col_2, sum(Value) over(partition by col_1(also try changing this to "col_2"))) as sum_value
from myTable
GROUP BY col_2,col_1 
22
Dave