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.
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.
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