Fonctions analytiques et GROUP BY
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:
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:
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:
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) |
Citation:
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:
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
) |