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 05/01/2011, 22h54   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 4
Points : 1
Points : 1
Par défaut Sous-requête

Bonjour,

J'ai réalisé deux requetes qui donnent comme résultat une valeur unique. Je souhaite diviser dans la même requête ces deux résultats c.à.d réaliser l'opération 256/310= 0,82

Requête du numérateur:

Code :
1
2
3
4
5
SELECT Count(dbo_mvtFabr.ni_num) AS CountOfni_num
FROM dbo_mvtFabr
WHERE (((dbo_mvtFabr.pt_num) LIKE "296101257AF") AND ((dbo_mvtFabr.mf_statut) LIKE "GO") AND ((dbo_mvtFabr.mf_dmvtdeb) LIKE "11/*/2010*") AND ((dbo_mvtFabr.mf_obs) LIKE "*Treillis OK*") AND ((dbo_mvtFabr.mf_trans)="Re_InSitu" OR (dbo_mvtFabr.mf_trans)="InSitu"))
GROUP BY dbo_mvtFabr.ImportLocationID
HAVING (((dbo_mvtFabr.ImportLocationID)=3));
Résultat de la requête numérateur: 256


Requête du dénominateur:

Code :
1
2
3
4
5
SELECT Count(dbo_mvtFabr.ni_num) AS CountOfni_num
FROM dbo_mvtFabr
WHERE (((dbo_mvtFabr.pt_num) LIKE "296101257AF") AND ((dbo_mvtFabr.mf_dmvtdeb) LIKE "11/*/2010*") AND ((dbo_mvtFabr.mf_trans)="insitu"))
GROUP BY dbo_mvtFabr.ImportLocationID
HAVING (((dbo_mvtFabr.ImportLocationID)=3));
Résultat Requête du dénominateur: 310

Merci
le-cinq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 23h39   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 443
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 443
Points : 7 525
Points : 7 525
Je n'ai pas les moyens de vérifier mais, en factorisant les conditions de filtres et en supprimant les parenthèses inutiles, ça devrait donner quelque chose comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT  SUM(CASE WHEN   mf_statut   = 'GO'
                    AND mf_obs      LIKE '%Treillis OK%'
                    AND mf_trans    IN ('Re_InSitu', 'InSitu')
            THEN 1 ELSE 0 END)
    /   SUM(CASE WHEN mf_trans  = 'insitu'
            THEN 1 ELSE 0 END)
FROM    dbo_mvtFabr
WHERE   ImportLocationID = 3
    AND pt_num          = '296101257AF'
    AND mf_dmvtdeb      LIKE '11/%/2010%'
    AND mf_trans        IN ('Re_InSitu', 'InSitu', 'insitu')
;
Attention, si mf_dmvtdeb est une date et pas une chaine de caractères, la comparaison risque de ne pas être correcte en fonction du format de date par défaut de votre installation.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 23h16   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 4
Points : 1
Points : 1
J'ai oublié de présicer que j'utilise la requête sous ACCESS et que la structure conditionnelle CASE ne fonctionne pas.
le-cinq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2011, 12h35   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 443
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 443
Points : 7 525
Points : 7 525
Il y a bien un équivalent ?
Iif() ou quelque chose comme ça ?
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2011, 17h34   #5
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Bonjour,
Ta requête numérateur peut s'écrire
Code :
1
2
3
4
5
6
7
8
SELECT Count(M.ni_num) AS numerateur
FROM dbo_mvtFabr
WHERE 	(M.pt_num = '296101257AF') 
		AND (M.mf_statut='GO') 
		AND (M.mf_dmvtdeb LIKE '11/*/2010*') 
		AND (M.mf_obs LIKE '*Treillis OK*') 
		AND (M.mf_trans IN ('Re_InSitu','InSitu'))
		AND (M.ImportLocationID=3);
La requête denominateur
Code :
1
2
3
4
5
6
7
SELECT Count(M.ni_num) AS denominateur
FROM dbo_mvtFabr M
WHERE 	(M.pt_num ='296101257AF') 
		AND (M.mf_dmvtdeb LIKE '11/*/2010*')
		AND (M.mf_trans='insitu')
		AND (ImportLocationID=3)
;
Le quotient
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT numerateur/denominateur
FROM
(
	SELECT Count(M.ni_num) AS numerateur
	FROM dbo_mvtFabr
	WHERE 	(M.pt_num = '296101257AF') 
			AND (M.mf_statut='GO') 
			AND (M.mf_dmvtdeb LIKE '11/*/2010*') 
			AND (M.mf_obs LIKE '*Treillis OK*') 
			AND (M.mf_trans IN ('Re_InSitu','InSitu'))
			AND (M.ImportLocationID=3)
) AS N
CROSS JOIN
(	SELECT Count(M.ni_num) AS denominateur
	FROM dbo_mvtFabr M
	WHERE 	(M.pt_num ='296101257AF') 
			AND (M.mf_dmvtdeb LIKE '11/*/2010*')
			AND (M.mf_trans='insitu')
			AND (ImportLocationID=3)
) AS D
;
Attention quand même à ce qu'à souligné al1_24, si mf_dmvtdeb est une date le résultat du like n'est pas garanti.
Remarque également, le like sur une expression fixe n'a pas d'intérêt autant utiliser =, ce que j'ai fait.
Le having n'est à utiliser qu'avec des expressions utilisant l'agregation, sum, avg, count, min, max etc.. et n'est donc pas approprié dans ton cas.
Comme d'habitude access a rajouté 3 tonnes de parenthèses inutiles nuisant à la lisibilité.

A+
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 15h18   #6
Invité de passage
 
Inscription : janvier 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 4
Points : 1
Points : 1
Par défaut Division de deux requêtes sur Access

Bonjour,

Merci pour ces premières réponses.
J'obtiens le bon résultat avec les deux requêtes (numerateur&denominateur) réécrites mais lorsque je passe sur la requête quotient j'ai l'erreur suivante: Syntax error in FROM clause.. Par ailleurs je ne comprends pas dans la requête quotient la présence de la table M "FROM dbo_mvtFabr M" (au niveau du dénominateur).

Requête numerateur fonctionne bien avec le nouveau code:OK

Code :
1
2
3
4
5
6
7
8
 SELECT Count(dbo_mvtFabr.ni_num) AS numerateur
                  FROM dbo_mvtFabr
                  WHERE   (dbo_mvtFabr.pt_num = '296101257AF') 
                               AND (dbo_mvtFabr.mf_statut='GO') 
                               AND (dbo_mvtFabr.mf_dmvtdeb LIKE '11/*/2010*') 
                               AND (dbo_mvtFabr.mf_obs LIKE '*Treillis OK*') 
                               AND (dbo_mvtFabr.mf_trans IN ('Re_InSitu','InSitu'))
                               AND (dbo_mvtFabr.ImportLocationID=3);
Requête denominateur fonctionne bien avce le nouveau code:OK

Code :
1
2
3
4
5
6
 SELECT Count(dbo_mvtFabr.ni_num) AS denominateur
                FROM dbo_mvtFabr 
                WHERE          (dbo_mvtFabr.pt_num ='296101257AF') 
                                    AND (dbo_mvtFabr.mf_dmvtdeb LIKE '11/*/2010*')
                                    AND (dbo_mvtFabr.mf_trans='insitu')
                                    AND (ImportLocationID=3);
La requête quotient ne fonctionne pas:Syntax error in FROM clause..

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT   numerateur/denominateur
FROM
(                SELECT Count(dbo_mvtFabr.ni_num) AS numerateur
                  FROM dbo_mvtFabr
                  WHERE   (dbo_mvtFabr.pt_num = '296101257AF') 
                                   AND (dbo_mvtFabr.mf_statut='GO') 
                                   AND (dbo_mvtFabr.mf_dmvtdeb LIKE '11/*/2010*') 
                                   AND (dbo_mvtFabr.mf_obs LIKE '*Treillis OK*') 
                                   AND (dbo_mvtFabr.mf_trans IN ('Re_InSitu','InSitu'))
                                   AND (dbo_mvtFabr.ImportLocationID=3)
) AS N
CROSS JOIN
(               SELECT Count(dbo_mvtFabr.ni_num) AS denominateur
                FROM dbo_mvtFabr
                WHERE   (dbo_mvtFabr.pt_num ='296101257AF') 
                                   AND (dbo_mvtFabr.mf_dmvtdeb LIKE '11/*/2010*')
                                   AND (dbo_mvtFabr.mf_trans='insitu')
                                   AND (ImportLocationID=3)
) AS D
;
Merci pour votre aide
le-cinq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 19h17   #7
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Bonjour,
Le M dans denominateur est un alias, cela m'évite de taper dbo_mvtFabr pour chaque colonne, et je trouve que c'est plus lisible ainsi.

Si Access ne connait pas le cross join tu peux le remplacer par une virgule, c'est l'ancienne méthode de faire un produit cartésien
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT numerateur/denominateur
FROM
(
	SELECT Count(M.ni_num) AS numerateur
	FROM dbo_mvtFabr
	WHERE 	(M.pt_num = '296101257AF') 
			AND (M.mf_statut='GO') 
			AND (M.mf_dmvtdeb LIKE '11/*/2010*') 
			AND (M.mf_obs LIKE '*Treillis OK*') 
			AND (M.mf_trans IN ('Re_InSitu','InSitu'))
			AND (M.ImportLocationID=3)
) AS N,
(	SELECT Count(M.ni_num) AS denominateur
	FROM dbo_mvtFabr M
	WHERE 	(M.pt_num ='296101257AF') 
			AND (M.mf_dmvtdeb LIKE '11/*/2010*')
			AND (M.mf_trans='insitu')
			AND (ImportLocationID=3)
) AS D
;
Tu peux aussi remplacer la requête par une vrai requête avec jointure sur le ImportLocationID, puisqu'il a la même valeur dans les deux sous-requete.
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
SELECT numerateur/denominateur
FROM
(
	SELECT ImportLocationID,Count(M.ni_num) AS numerateur
	FROM dbo_mvtFabr
	WHERE 	(M.pt_num = '296101257AF') 
			AND (M.mf_statut='GO') 
			AND (M.mf_dmvtdeb LIKE '11/*/2010*') 
			AND (M.mf_obs LIKE '*Treillis OK*') 
			AND (M.mf_trans IN ('Re_InSitu','InSitu'))
	GROUP BY ImportLocationID
) AS N
INNER JOIN
(	SELECT ImportLocationID,Count(M.ni_num) AS denominateur
	FROM dbo_mvtFabr AS M
	WHERE 	(M.pt_num ='296101257AF') 
			AND (M.mf_dmvtdeb LIKE '11/*/2010*')
			AND (M.mf_trans='insitu')
			AND (ImportLocationID=3)
	GROUP BY ImportLocationID
) AS D
ON N.ImportLocationID=D.ImportLocationID
WHERE  (N.ImportLocationID=3)
;
soazig est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2011, 15h52   #8
Invité de passage
 
Inscription : janvier 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 4
Points : 1
Points : 1
Bonjour,

Ça fonctionne à présent. Effectivement Access ne reconnaissait pas le cross join.
Merci.
le-cinq est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h09.


 
 
 
 
Partenaires

Hébergement Web