web-dev-qa-db-fra.com

Vous ne pouvez pas utiliser group by et over (partition by) dans la même requête?

J'ai une table myTable avec 3 colonnes. col_1 Est un INTEGER et les 2 autres colonnes sont DOUBLE. Par exemple, col_1={1, 2}, col_2={0.1, 0.2, 0.3}. Chaque élément de col_1 Est composé de toutes les valeurs de col_2 Et col_2 A des valeurs répétées pour chaque élément de col_1. La 3e colonne peut avoir n'importe quelle valeur comme indiqué ci-dessous:

    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

Ce que je veux, c'est utiliser une fonction d'agrégation SUM() sur la partition de colonne Value par col_1 Et regroupée par col_2. Le tableau ci-dessus devrait ressembler à ceci:

    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

J'ai essayé la requête SQL suivante:

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

Mais sur DB2 v10.5, il a donné l'erreur suivante:

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.

Pouvez-vous bien vouloir signaler ce qui ne va pas. Je n'ai pas beaucoup d'expérience avec SQL.

Je vous remercie.

13
user3557405

J'ai trouvé la solution.

Je n'ai pas besoin d'utiliser OVER(PARTITION BY col_1) car il est déjà dans le GROUP BY clause. Ainsi, la requête suivante me donne la bonne réponse:

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

puisque je regroupe déjà w.r.t col_1 et col_2.

Dave, merci, j'ai eu l'idée de votre message.

7
user3557405

Oui, vous pouvez, mais vous devez être cohérent en ce qui concerne les niveaux de regroupement. Autrement dit, si votre requête est une requête GROUP BY, alors dans une fonction analytique, vous ne pouvez utiliser que des colonnes "détail" de la partie "non analytique" de vos colonnes sélectionnées. Ainsi, vous pouvez utiliser les colonnes GROUP BY ou les agrégats non analytiques, comme cet exemple:

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

J'espère que cela pourra aider

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