Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/04/2011, 11h30   #1
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 24
Points : 7
Points : 7
Par défaut Total dans requête sql

Bonjour,

dans une requête sql qui se décompose en plusieurs requêtes, dans la requête finale qui affiche les résultats, j'ai une colonne total qui est une somme de 3 colonnes (où les informations sont mises dans 3 tables temporaires différentes) or si je n'ai pas de résultat dans la 3ème colonne , il ne fait pas le total

La requête :

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
SELECT num numtab1, gam, nom, pre, dan, 
'['||ser||'] '||slib service, 
'['||ufo||'] '||ulib ufresult,dat, das, rss, grp 
FROM tabh, tabp, tabser,tabu
WHERE AND tabser.sermsi = 1  
AND ser IN (PARAM3) 
AND tabp.pndo = tabh.hndo 
AND tabh.ser = tabser.cod 
AND tabh.ufo = tabu.ucod
ORDER BY gam,das 
INTO temp taberesult1
 
SELECT service,ufresult,count(*)nbsansdp FROM taberesult1
GROUP BY 1,2
INTO temp tab1;
 
SELECT nom,pre,dan,num,gam,rss,'['||ufo||'] '||ulib ufresult,'['||ser||'] '||slib service,dat,das 
FROM tabh,tabp,tabser,tabu
WHERE AND tabp.pndo = tabh.hndo 
AND tabh.num NOT IN (SELECT nsj FROM tabrum)
AND tabh.num NOT IN (SELECT numtab1 FROM taberesult1)
AND das BETWEEN PARAM1 AND PARAM2 
AND ser IN (PARAM3) 
AND tabh.ser = tabser.cod
AND tabh.ufo = tabu.ucod
INTO temp taberesult2;
 
SELECT service,ufresult,count(*) nbsansnumrss FROM taberesult2
GROUP BY 1,2
INTO temp tab2;
 
 
SELECT nosej,numrss,'['||unite||'] '||ulib ufresult,'['||rser||'] '||slib service,entdat,sordat 
FROM tabrum,tabser,tabu
WHERE sordat BETWEEN PARAM1 AND PARAM2 
AND tabrum.rser IN (PARAM3) 
AND tabrum.rser = tabser.cod
AND tabrum.unite = tabu.ucod
INTO temp taberesult3;
 
SELECT service,ufresult,count(*) nbavecnumrss FROM taberesult3
GROUP BY 1,2
INTO temp tab3;
requete affichant le résultat final :
Code :
1
2
3
4
5
SELECT tab3.service,tab3.ufresult,tab1.nbsansdp,tab2.nbsansnumrss,tab3.nbavecnumrss,(tab1.nbsansdp+tab2.nbsansnumrss+tab3.nbavecnumrss) restotal, round((((tab1.nbsansdp+tab2.nbsansnumrss)/(tab1.nbsansdp+tab2.nbsansnumrss+tab3.nbavecnumrss))*100),2) pourcentage
FROM OUTER(tab1),OUTER(tab2),tab3
WHERE tab1.ufresult=tab3.ufresult
AND tab2.ufresult=tab3.ufresult
ORDER BY tab3.service;
Voici le resultat que j'obtiens :

Citation:
[11] U [8227] DU 3 155
[17] P [0425] HNLA 31
[23] CG [4010] CGV 2 3 117 122 4,1
[97] HSPC[4900] HSPC 4 130
Comment je peux faire pour que dans RESTOTAL j'aie bien le total même si je n'ai pas d'informations dans la colonne tab1.nbsansdp ou dans la colonne tab2.nbsansnumrss ?
merci
sherve est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 14h52   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
je dois avouer que j'ai du mal a saisir

mais si je peux proposer de faire attention aux valeurs (totaux null)

Null + quelque chose = null

il faut donc remplacer le null par zéro avec la fonction NULLIF()

mais je le répète, je ne suis pas sûr que ce soit là que se pose le problème parce que le tableau de résultats est curieux dans le nombre de colonnes en sortie

Citation:
U [8227] DU 3 155
P [0425] HNLA 31
CG [4010] CGV 2 3 117 122 4,1
HSPC[4900] HSPC 4 130
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 15h32   #3
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 24
Points : 7
Points : 7
Le résultat est le suivant : (j'ai remplacé les blancs par des zéros) pour exemple la ligne [11]

tab1.nbsansdp = 0
tab2.nbsansnumrss = 3
tab3.nbavecnumrss = 155

restotal = 0 et moi je voudrais obtenir restotal = 158

exemple pour la ligne [97]

tab1.nbsansdp = 4
tab2.nbsansnumrss = 0
tab3.nbavecnumrss = 130

restotal = 0 et moi je voudrais obtenir restotal = 134

Comment puis-je faire ?
merci pour votre aide
sherve est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 16h26   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
si les zéros sont bien présents, je ne vois pas de problème.....


vous pourriez remettre les résultats affichés issus de la requête ?
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 16h33   #5
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 24
Points : 7
Points : 7
non je n'ai pas de zéro dans le résultat de ma requête mais des blancs, (j'ai mis des zéros juste pour l'exemple dans mon post sur le forum) et c'est ce que j'essaye de faire dans ma requête, remplacer une valeur null par des zéros en essayant par ISNULL ou IFNULL mais ma requête ne fonctionne pas.
Pour info, je travaille sur une base de donnée informix
sherve est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 16h58   #6
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
je ne connais pas du tout informix


essayes la fonction COALESCE qui une fonction standard :

Code :
1
2
3
4
5
6
7
SELECT Tab3.Service,
       Tab3.Ufresult,
       COALESCE(Tab1.Nbsansdp, 0),
       COALESCE(Tab2.Nbsansnumrss, 0),
       COALESCE(Tab3.Nbavecnumrss, 0),
       (COALESCE(Tab1.Nbsansdp, 0) + COALESCE(Tab2.Nbsansnumrss, 0) + COALESCE(Tab3.Nbavecnumrss, 0)) Restotal,
       ROUND((((COALESCE(Tab1.Nbsansdp, 0) + COALESCE(Tab2.Nbsansnumrss, 0)) / (COALESCE(Tab1.Nbsansdp, 0) + COALESCE(Tab2.Nbsansnumrss, 0) + COALESCE(Tab3.Nbavecnumrss, 0))) * 100), 2) Pourcentage
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/04/2011, 17h25   #7
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 24
Points : 7
Points : 7

informix n'a pas l'air de connaitre
COALESCE
sherve est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 08h51   #8
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
bonjour

et qu'en est-il de la fonction NULLIF ? existe-t-elle sous INFORMIX ?


sinon, il pourrait être possible de passer au niveau de la requête qui calcule les sommes d'utiliser le CASE (cela existe ?)
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 09h16   #9
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 24
Points : 7
Points : 7

et non pareil avec NULLIF
sherve est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 10h57   #10
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
isnull(val, 0)

nvl(val, 0)

au cas où

sinon, goto documentation informix
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 15h10   #11
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
attention, ISNULL() renvoie 0 ou 1

et ce type de syntaxe est il accepte ?
(pour generer le 0 au niveau de la requete COUNT)
Code :
1
2
3
4
5
6
7
8
9
10
  SELECT Service,
         Ufresult,
         CASE
           WHEN COUNT(*) IS NULL THEN
               0
           ELSE COUNT(*)
         END Nbsansdp
    FROM Taberesult1
    GROUP BY 1, 2
  INTO Temp Tab1;
Citation:
INTO Temp Tab1
mais pourquoi creer des tables temporaires ? pourquoi ne pas utiliser des sous-requetes ?
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 16h10   #12
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Citation:
Envoyé par dehorter olivier Voir le message
attention, ISNULL() renvoie 0 ou 1
Ah ouais, c'est méchant ça

Avec SQL Server, isnull(val1, val2) renvoie val1 si différent de null, sinon val2

Code :
1
2
3
4
5
6
7
8
 
SELECT ISNULL(1, 12)
-----------
1
 
SELECT ISNULL(NULL, 12)
-----------
12
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 16h49   #13
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
voila ce que je merite
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h48.


 
 
 
 
Partenaires

Hébergement Web