Bonjour,

n'ayant pas d'oracle sous la main, je cherche à vérifier si la requête suivante fonctionne sous Oracle.

Le principe est de calculez pour chaque produit et par années/mois le chiffre d'affaire de la période et le nombre de ventes, ainsi que leurs cumuls depuis l'origine. La table S_COM.T_VENTE_VTE comporte les colonnes :
(VTE_DATE, VTE_PRODUIT, VTE_MONTANT)...

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
CREATE SCHEMA S_COM;
 
CREATE TABLE S_COM.T_VENTE_VTE
(VTE_DATE    DATE,
 VTE_PRODUIT VARCHAR(32),
 VTE_MONTANT DECIMAL(16,2))
 
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-01-12', 'Zebulon', 33.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-01-13', 'Zebulon', 44.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-01-14', 'Zebulon', 22.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-02-12', 'Zebulon', 55.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-02-15', 'Zebulon', 11.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-02-18', 'Zebulon', 88.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-03-10', 'Zebulon', 32.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-01-10', 'Agormat', 21.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-01-12', 'Agormat', 47.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-01-14', 'Agormat', 53.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-01-15', 'Agormat', 29.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-02-12', 'Agormat', 16.21)   
INSERT INTO S_COM.T_VENTE_VTE VALUES ('2007-02-15', 'Agormat', 19.21)
Voici la requête théorique à la norme SQL:2003 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
SELECT VTE_PRODUIT,
       EXTRACT(YEAR FROM VTE_DATE)                  AS AN,
       EXTRACT(MONTH FROM VTE_DATE)                 AS MOIS,
       SUM(VTE_MONTANT) OVER(W_SUMCNT)              AS TOTAL_MONTANT, 
       SUM(SUM(VTE_MONTANT)) OVER (W_CUMULS)        AS CUMUL_MONTANT,
       COUNT(ALL VTE_MONTANT) OVER(W_SUMCNT)        AS QUANTITE,
       COUNT(COUNT(ALL VTE_MONTANT)) OVER(W_CUMULS) AS CUMUL_QUANTITE
FROM   S_COM.T_VENTE_VTE
WINDOW W_SUMCNT AS (PARTITION BY VTE_PRODUIT, 
                               EXTRACT(YEAR FROM VTE_DATE), 
                               EXTRACT(MONTH FROM VTE_DATE))
       W_CUMULS AS (ORDER BY VTE_PRODUIT UNBOUNDED PRECEDING)
Voici ce qu'un de mes amis à commencer à pisser :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
SELECT VTE_PRODUIT,  
       EXTRACT(YEAR FROM VTE_DATE) AS AN , 
       EXTRACT(MONTH FROM VTE_DATE) AS Mois, 
       SUM(VTE_MONTANT) 
          OVER (PARTITION BY VTE_PRODUIT, 
                EXTRACT(YEAR FROM VTE_DATE),
                EXTRACT(MONTH FROM VTE_DATE)) AS TOTAL_MONTANT, 
       COUNT(ALL VTE_MONTANT) 
          OVER (PARTITION BY VTE_PRODUIT ORDER BY 1 ROWS 
                UNBOUNDED PRECEDING) AS QUANTITE 
 FROM   T_VENTE_VTE;

Bref, si vous avez du temps ...

A +