Le concept est très bien expliqué par la réponse acceptée, mais je trouve que plus on voit d'exemple, mieux il s'enfonce. Voici un exemple incrémentiel:
1) Le patron dit "obtenez-moi le nombre d'articles que nous avons en stock, groupés par marque"
Vous dites : "pas de problème"
SELECT
BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Résultat:
+--------------+---------------+
| Brand | Count |
+--------------+---------------+
| H&M | 50 |
+--------------+---------------+
| Hugo Boss | 100 |
+--------------+---------------+
| No brand | 22 |
+--------------+---------------+
2) Le patron dit "Maintenant, obtenez-moi une liste de tous les articles, avec leur marque ET le nombre d'articles que la marque respective possède"
Vous pouvez essayer:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Mais vous obtenez:
ORA-00979: not a GROUP BY expression
C'est là OVER (PARTITION BY BRAND)
qu'intervient:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID) OVER (PARTITION BY BRAND)
FROM
ITEMS;
Whic signifie:
COUNT(ITEM_ID)
- obtenir le nombre d'articles
OVER
- Sur l'ensemble des rangées
(PARTITION BY BRAND)
- qui ont la même marque
Et le résultat est:
+--------------+---------------+----------+
| Items | Brand | Count() |
+--------------+---------------+----------+
| Item 1 | Hugo Boss | 100 |
+--------------+---------------+----------+
| Item 2 | Hugo Boss | 100 |
+--------------+---------------+----------+
| Item 3 | No brand | 22 |
+--------------+---------------+----------+
| Item 4 | No brand | 22 |
+--------------+---------------+----------+
| Item 5 | H&M | 50 |
+--------------+---------------+----------+
etc...