Hello,

Je ne comprends pas bien comment se comportent les fonctions analytiques utilisant OVER par rapport au GROUP BY... en fait je n'arrive pas du tout à les utiliser dans ce contexte.

Si par exemple, je reprends la table COTATION de l'article de Lalystar :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
-- historique des cotations
create table COTATION (
   isin    varchar2(20),
   dte     date,
   ouv     number,
   max     number,
   min     number,
   clo     number,
   volume  number,
   constraint pk_cotation primary key (isin, dte)
);
Lorsque j'interroge la table au niveau individuel, avec par exemple une somme annuelle des cotations de clôture, tout fonctionne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
select isin, 
  dte, 
  extract(year from dte) as annee, 
  clo, 
  sum(clo) over (partition by extract(year from dte)) as total_annuel
from cotation
(oui, je sais, c'est idiot d'additionner des cotations... imaginons juste que ce soit n'importe quoi d'autre, par exemple des litres de vodka bus par jour )

Mais si maintenant je veux le total annuel de chaque société en regard du total annuel toutes sociétés confondues, j'obtiens une erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
select isin, 
  extract(year from dte) as annee, 
  sum(clo) as total_societe, 
  sum(clo) over (partition by extract(year from dte)) as total_toutes_soc
from cotation
group by isin, extract(year from dte)
ORA-00979: N'est pas une expression GROUP BY
La partie surlignée par Toad est sum(clo) over...


Que faut-il faire pour faire marcher cette requête ?


PS : je reprends ici le script de Lalystar pour alimenter la table COTATION.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- table de nomenclature des sociétés
create table ACTION (
   isin     varchar2(20),
   libelle  varchar2(100),
   constraint pk_action primary key (isin)
 
insert into ACTION
select   'FR' || rownum, 'SOCIETE ' || rownum
from     ALL_OBJECTS
where    rownum < 50
 
insert into COTATION
select
   isin,
   dte,
   round(100*dbms_random.value, 2),
   round(100*dbms_random.value, 2),
   round(100*dbms_random.value, 2),
   round(100*dbms_random.value, 2),
   round(100000*dbms_random.value)
from
   ACTION,
   (
      select   sysdate-rownum dte
      from     ALL_OBJECTS
      where    rownum < 200
   )