Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/12/2012, 16h28   #1
mohe27
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 103
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 103
Points : 14
Points : 14
Par défaut Afficher la somme globale d'une colonne via SQL

Bonjour les amis,

Voilà je voudrai savoir s'il est possible d'afficher le global (somme) d'une colonne en fin du resultat d'une requête comme le montre l'exemple ci-dessous:

Produit | Qté
-------------
article 1| 10
article 2| 35
article 3| 20
-------------
Global | 65

merci
mohe27 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 17h51   #2
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

Informations professionnelles :
Activité : Senior Consultant DBA (Trivadis SA)
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
Hello,


Je le ferai comme ca.


Code :
1
2
3
4
5
6
7
8
9
10
11
 
 
WITH C AS
  (SELECT 'Article 1' Lib, 1 Qte FROM DUAL UNION ALL
   SELECT 'Article 2' , 2 FROM DUAL UNION ALL
   SELECT 'Article 3' , 5 FROM DUAL UNION ALL
   SELECT 'Article 4' , 20 FROM DUAL UNION ALL
   SELECT 'Article 5' , 29 FROM DUAL UNION ALL
   SELECT 'Article 6' , 40 FROM DUAL)
   SELECT nvl (lib,'Global'), sum (Qte) Qte FROM C
   GROUP BY   ROLLUP (Lib)
jko
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 22h17   #3
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 278
Points : 13 481
Points : 13 481
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Le nvl(lib,'Global') fonctionnera sur cet exemple mais c'est une mauvaise pratique.
Il vaut mieux tester la valeur du grouping :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
WITH MaTable AS
(
SELECT 'Article 1' AS Lib,  1 AS Qte FROM DUAL UNION ALL
SELECT 'Article 2'       ,  2        FROM DUAL UNION ALL
SELECT 'Article 3'       ,  5        FROM DUAL UNION ALL
SELECT 'Article 4'       , 20        FROM DUAL UNION ALL
SELECT 'Article 5'       , 29        FROM DUAL UNION ALL
SELECT 'Article 6'       , 40        FROM DUAL
)
  SELECT case grouping(lib) when 1 then 'Global' else lib end AS Lib
       , sum (Qte)                                            AS Qte
    FROM MaTable
GROUP BY ROLLUP(Lib);
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 22h24   #4
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

Informations professionnelles :
Activité : Senior Consultant DBA (Trivadis SA)
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
Citation:
Envoyé par Waldar Voir le message
Le nvl(lib,'Global') fonctionnera sur cet exemple mais c'est une mauvaise pratique.
Il vaut mieux tester la valeur du grouping :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
WITH MaTable AS
(
SELECT 'Article 1' AS Lib,  1 AS Qte FROM DUAL UNION ALL
SELECT 'Article 2'       ,  2        FROM DUAL UNION ALL
SELECT 'Article 3'       ,  5        FROM DUAL UNION ALL
SELECT 'Article 4'       , 20        FROM DUAL UNION ALL
SELECT 'Article 5'       , 29        FROM DUAL UNION ALL
SELECT 'Article 6'       , 40        FROM DUAL
)
  SELECT case grouping(lib) when 1 then 'Global' else lib end AS Lib
       , sum (Qte)                                            AS Qte
    FROM MaTable
GROUP BY ROLLUP(Lib);
Voui, j'avais oublié cette fonction grouping!

Merci
jko
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 09h33   #5
islamov2000
Membre chevronné
 
Avatar de islamov2000
 
Homme islamov islamov
Ingénieur d'études & developpement en informatique
Inscription : septembre 2007
Messages : 465
Détails du profil
Informations personnelles :
Nom : Homme islamov islamov
Localisation : Algérie

Informations professionnelles :
Activité : Ingénieur d'études & developpement en informatique
Secteur : Industrie

Informations forums :
Inscription : septembre 2007
Messages : 465
Points : 642
Points : 642
Envoyer un message via Yahoo à islamov2000 Envoyer un message via Skype™ à islamov2000
Citation:
Envoyé par Waldar Voir le message
Le nvl(lib,'Global') fonctionnera sur cet exemple mais c'est une mauvaise pratique.
Il vaut mieux tester la valeur du grouping :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
WITH MaTable AS
(
SELECT 'Article 1' AS Lib,  1 AS Qte FROM DUAL UNION ALL
SELECT 'Article 2'       ,  2        FROM DUAL UNION ALL
SELECT 'Article 3'       ,  5        FROM DUAL UNION ALL
SELECT 'Article 4'       , 20        FROM DUAL UNION ALL
SELECT 'Article 5'       , 29        FROM DUAL UNION ALL
SELECT 'Article 6'       , 40        FROM DUAL
)
  SELECT case grouping(lib) when 1 then 'Global' else lib end AS Lib
       , sum (Qte)                                            AS Qte
    FROM MaTable
GROUP BY ROLLUP(Lib);
Excellent
Je viens d'apprendre grouping, je vois qu'elle s'associe avec cube, peut tu me l'expliquer?
__________________
d'avoir Pensé à voter positivement pour ceux qui vous ont aidés.
islamov2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 10h53   #6
mohe27
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 103
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 103
Points : 14
Points : 14
merci les amis,

je vais tester ça sur un cas réel et je vous reviens

mohe27 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 16h17   #7
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

Informations professionnelles :
Activité : Senior Consultant DBA (Trivadis SA)
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
Citation:
Envoyé par islamov2000 Voir le message
Excellent
Je viens d'apprendre grouping, je vois qu'elle s'associe avec cube, peut tu me l'expliquer?
Voici 2 exemples:

Avec rollup:
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
28
29
30
31
32
33
34
35
36
37
 
 
WITH MaTable AS
(
SELECT 'Categ 1' AS Categ,  'Article 1' AS Lib,1 AS Qte FROM DUAL UNION ALL
SELECT 'Categ 1'       ,  'Article 2'       ,  2        FROM DUAL UNION ALL
SELECT 'Categ 2'       ,  'Article 3'       ,  5        FROM DUAL UNION ALL
SELECT 'Categ 3'       ,  'Article 4'       , 20        FROM DUAL UNION ALL
SELECT 'Categ 3'       ,  'Article 5'       , 29        FROM DUAL UNION ALL
SELECT 'Categ 2'       ,  'Article 6'       , 40        FROM DUAL
)
  SELECT 
  case grouping (Categ) 
     when 1 then 'Global Category' 
     else  Categ
    end AS Categ,
    case grouping (lib) 
     when 1 then 'Global Lib' 
     else  lib
    end AS Lib,
    sum (Qte)   AS Qte
    FROM MaTable
GROUP BY rollup(categ,Lib)
ORDER BY Categ,Lib
 
CATEG           LIB        QTE
--------------- ---------- ---
Categ 1         Article 1    1 
Categ 1         Article 2    2 
Categ 1         Global Lib   3 
Categ 2         Article 3    5 
Categ 2         Article 6   40 
Categ 2         Global Lib  45 
Categ 3         Article 4   20 
Categ 3         Article 5   29 
Categ 3         Global Lib  49 
Global Category Global Lib  97
Avec cube:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
 
WITH MaTable AS
(
SELECT 'Categ 1' AS Categ,  'Article 1' AS Lib,1 AS Qte FROM DUAL UNION ALL
SELECT 'Categ 1'       ,  'Article 2'       ,  2        FROM DUAL UNION ALL
SELECT 'Categ 2'       ,  'Article 3'       ,  5        FROM DUAL UNION ALL
SELECT 'Categ 3'       ,  'Article 4'       , 20        FROM DUAL UNION ALL
SELECT 'Categ 3'       ,  'Article 5'       , 29        FROM DUAL UNION ALL
SELECT 'Categ 2'       ,  'Article 6'       , 40        FROM DUAL
)
  SELECT 
  case grouping (Categ) 
     when 1 then 'Global Category' 
     else  Categ
    end AS Categ,
    case grouping (lib) 
     when 1 then 'Global Lib' 
     else  lib
    end AS Lib,
    sum (Qte)   AS Qte
    FROM MaTable
GROUP BY cube(categ,Lib)
ORDER BY Categ,Lib
 
CATEG           LIB        QTE
--------------- ---------- ---
Categ 1         Article 1    1 
Categ 1         Article 2    2 
Categ 1         Global Lib   3 
Categ 2         Article 3    5 
Categ 2         Article 6   40 
Categ 2         Global Lib  45 
Categ 3         Article 4   20 
Categ 3         Article 5   29 
Categ 3         Global Lib  49 
Global Category Article 1    1 
Global Category Article 2    2 
Global Category Article 3    5 
Global Category Article 4   20 
Global Category Article 5   29 
Global Category Article 6   40 
Global Category Global Lib  97
Et une variante avec grouping sets

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
28
29
 
WITH MaTable AS
(
SELECT 'Categ 1' AS Categ,  'Article 1' AS Lib,1 AS Qte FROM DUAL UNION ALL
SELECT 'Categ 1'       ,  'Article 2'       ,  2        FROM DUAL UNION ALL
SELECT 'Categ 2'       ,  'Article 3'       ,  5        FROM DUAL UNION ALL
SELECT 'Categ 3'       ,  'Article 4'       , 20        FROM DUAL UNION ALL
SELECT 'Categ 3'       ,  'Article 5'       , 29        FROM DUAL UNION ALL
SELECT 'Categ 2'       ,  'Article 6'       , 40        FROM DUAL
)
  SELECT 
  Categ,lib,
    sum (Qte)   AS Qte
    FROM MaTable
GROUP BY grouping sets(categ,Lib,NULL)
ORDER BY Categ,Lib
 
CATEG   LIB       QTE
------- --------- ---
Categ 1             3 
Categ 2            45 
Categ 3            49 
        Article 1   1 
        Article 2   2 
        Article 3   5 
        Article 4  20 
        Article 5  29 
        Article 6  40 
                   97
jko
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 18h06   #8
mohe27
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 103
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 103
Points : 14
Points : 14
Merci beaucoup les amis
j'ai pu ajuster tous ça sur un cas réel, ça marche à merveille.

Encore merci pour le coup de main, chapeau
mohe27 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h13.


 
 
 
 
Partenaires

Hébergement Web