OVH Cloud OVH Cloud

Anomalie dans l'éditeur de requête (WinDev 7.5)

6 réponses
Avatar
Yanick Charland
Bonjour,

Je monte une requête utilisant une table "Clients" et une table "Prêts".
Je demande à avoir tous les clients ainsi que le compte de leurs prêts (un
client peut ne pas avoir de prêt, j'aimerais obtenir 0 comme compte).

J'ai ajusté mes relations (inclure une ligne par client qui n'a pas de
prêts) et lorsque je demande un compte sur ma rubrique IdPrêts, le résultat
de la requête ne donne pas de compte à 0. La raison : le code généré par
l'éditeur de requête est le suivant :

SELECT Clients.Identification AS Identification,
COUNT(*) AS CumulPrets
FROM Clients LEFT OUTER JOIN Prets ON Clients.IDClients = Prets.IDClients
GROUP BY Clients.Identification

Pour obtenir les résultats valides, je change COUNT(*) par
COUNT(Prets.IdPrets)... chose que je désirais dès le départ... Pourquoi
l'éditeur génère-t-il un code SQL inexact (COUNT(*) ...) ? Est-ce suite à
une mauvaise manip de ma part ?

Merci bien de vos réponses.

Yanick Charland

6 réponses

Avatar
Fabrice Burghgraeve
bonjour.

"Yanick Charland" a écrit dans le message
de news:1SmEb.15280$
Bonjour,

Je monte une requête utilisant une table "Clients" et une table


"Prêts".
Je demande à avoir tous les clients ainsi que le compte de leurs prêts (un
client peut ne pas avoir de prêt, j'aimerais obtenir 0 comme compte).



(...)
Pour obtenir les résultats valides, je change COUNT(*) par
COUNT(Prets.IdPrets)... chose que je désirais dès le départ... Pourquoi
l'éditeur génère-t-il un code SQL inexact (COUNT(*) ...) ? Est-ce suite à
une mauvaise manip de ma part ?



C'est inexact de dire que le code SQL count(*) est inexact :)
Pourquoi dire cela ?
(ou quelque chose m'a echappé.)
count(*) va vous donner le nombre de lignes retournees.
Ces lignes vont etre regroupees par le group by.

extrait de oracle 7 - langage architecture administration :
----
les fonctions d'aggregats offertes par SQL sont les suivantes :
COUNT(*)...... nombre de lignes satisfaisant la requete
COUNT([DISTINCT|ALL] colonne).... nombre de valeurs de ùcolonne*
satisfaisant la requete
(... etc ...)
----
Dans la doc de ma base de donnees, je ne trouve que l'aggregat count(*), pas
l'autre,
et je me demande dans quelle mesure l'autre est SQL standard, ou une
extension d'oracle.
En tout cas je ne l'ai jamais vue dans le monde réel,
mais je suis encore loin d'avoir tout vu :)

Le probleme vient bien plus probablement de votre ODBC ou votre base de
donnees qui ne sait pas bien interpreter la commande SQL.

Quelle base est-ce ? par quel moyen d'acces ?

(sans le savoir, je dirais hyperfile ;) j'ai raison ?)



Merci bien de vos réponses.

Yanick Charland




--
Fabrice Burghgraeve
Computer & Services
suivez ce lien pour me repondre en prive :
http://cerbermail.com/?I3GMPRuXDD
Avatar
Yanick Charland
Bonjour,

Premièrement, merci bien pour votre réponse. Pour être plus précis,
j'utilise un accès natif SQL Server (puisque j'ai mes habitudes avec ce
SGBDR). Le fait que Count(*) m'insatisfasse (ouch...) est parce qu'il me
retourne un compte de 1 pour une ligne qui se trouve dans les résultats
grâce au LEFT JOIN (dans le cas d'un client sans prêt), ce qui est faux en
réalité. Ma requête tente de compter le nombre de prêts pour tous les
clients, certains étant dans les résultats en n'ayant aucun prêt... donc un
compte de 0...

J'espère que ça éclaire un peu... Merci encore !

Yanick Charland


"Fabrice Burghgraeve" a
écrit dans le message de news:brv8gg$n9i$
bonjour.

"Yanick Charland" a écrit dans le


message
de news:1SmEb.15280$
> Bonjour,
>
> Je monte une requête utilisant une table "Clients" et une table
"Prêts".
> Je demande à avoir tous les clients ainsi que le compte de leurs prêts


(un
> client peut ne pas avoir de prêt, j'aimerais obtenir 0 comme compte).
>
(...)
> Pour obtenir les résultats valides, je change COUNT(*) par
> COUNT(Prets.IdPrets)... chose que je désirais dès le départ... Pourquoi
> l'éditeur génère-t-il un code SQL inexact (COUNT(*) ...) ? Est-ce suite


à
> une mauvaise manip de ma part ?

C'est inexact de dire que le code SQL count(*) est inexact :)
Pourquoi dire cela ?
(ou quelque chose m'a echappé.)
count(*) va vous donner le nombre de lignes retournees.
Ces lignes vont etre regroupees par le group by.

extrait de oracle 7 - langage architecture administration :
----
les fonctions d'aggregats offertes par SQL sont les suivantes :
COUNT(*)...... nombre de lignes satisfaisant la requete
COUNT([DISTINCT|ALL] colonne).... nombre de valeurs de ùcolonne*
satisfaisant la requete
(... etc ...)
----
Dans la doc de ma base de donnees, je ne trouve que l'aggregat count(*),


pas
l'autre,
et je me demande dans quelle mesure l'autre est SQL standard, ou une
extension d'oracle.
En tout cas je ne l'ai jamais vue dans le monde réel,
mais je suis encore loin d'avoir tout vu :)

Le probleme vient bien plus probablement de votre ODBC ou votre base de
donnees qui ne sait pas bien interpreter la commande SQL.

Quelle base est-ce ? par quel moyen d'acces ?

(sans le savoir, je dirais hyperfile ;) j'ai raison ?)


>
> Merci bien de vos réponses.
>
> Yanick Charland


--
Fabrice Burghgraeve
Computer & Services
suivez ce lien pour me repondre en prive :
http://cerbermail.com/?I3GMPRuXDD




Avatar
Roumegou
"Fabrice Burghgraeve" vient de nous annoncer :
bonjour.

"Yanick Charland" a écrit dans le message
de news:1SmEb.15280$
Bonjour,

Je monte une requête utilisant une table "Clients" et une table "Prêts".
Je demande à avoir tous les clients ainsi que le compte de leurs prêts (un
client peut ne pas avoir de prêt, j'aimerais obtenir 0 comme compte).



(...)
Pour obtenir les résultats valides, je change COUNT(*) par
COUNT(Prets.IdPrets)... chose que je désirais dès le départ... Pourquoi
l'éditeur génère-t-il un code SQL inexact (COUNT(*) ...) ? Est-ce suite à
une mauvaise manip de ma part ?



C'est inexact de dire que le code SQL count(*) est inexact :)
Pourquoi dire cela ?
(ou quelque chose m'a echappé.)
count(*) va vous donner le nombre de lignes retournees.
Ces lignes vont etre regroupees par le group by.

extrait de oracle 7 - langage architecture administration :
----
les fonctions d'aggregats offertes par SQL sont les suivantes :
COUNT(*)...... nombre de lignes satisfaisant la requete
COUNT([DISTINCT|ALL] colonne).... nombre de valeurs de ùcolonne*
satisfaisant la requete
(... etc ...)
----
Dans la doc de ma base de donnees, je ne trouve que l'aggregat count(*), pas
l'autre,
et je me demande dans quelle mesure l'autre est SQL standard, ou une
extension d'oracle.



je confirme : select count distinct MACOL from MATABLE
fonctionne avec Oracle mais ne fonctionne pas avec toutes les bases
(pas avec access par ex)
C'est pourtant vâchement pratique puisque cela donne le nbre de valeurs
différentes pour une colonne.
alors qu'autrement, il faut pour le mème résultat heuh ??!!
select count(*) from (select MACOL From MATABLE GROUP BY MACOL)

Pour le pb cité plus haut, la requête doit être
SELECT TABLE1.CODCLI,TABLE1.NOMCLI,count(*) FROM TABLE1,TABLE2
WHERE TABLE1.IDT1=TABLE2.IDT2(-)
GROUP BY TABLE1.CODCLI,TABLE1.NOMCLI
ou
SELECT TABLE1.CODCLI,TABLE1.NOMCLI,count(*) FROM TABLE1 LEFT JOIN
TABLE2 ON TABLE1.IDT1=TABLE2.IDT2
GROUP BY TABLE1.CODCLI,TABLE1.NOMCLI

En tout cas je ne l'ai jamais vue dans le monde réel,
mais je suis encore loin d'avoir tout vu :)

Le probleme vient bien plus probablement de votre ODBC ou votre base de
donnees qui ne sait pas bien interpreter la commande SQL.

Quelle base est-ce ? par quel moyen d'acces ?

(sans le savoir, je dirais hyperfile ;) j'ai raison ?)



Mais non on parlait de base de données ;-)



Merci bien de vos réponses.

Yanick Charland





--
Eric Roumegou
http://cerbermail.com/?Wk2D8D62KI
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou
Après mure réflexion, "Yanick Charland" a écrit :
Bonjour,

Premièrement, merci bien pour votre réponse. Pour être plus précis,
j'utilise un accès natif SQL Server (puisque j'ai mes habitudes avec ce
SGBDR). Le fait que Count(*) m'insatisfasse (ouch...) est parce qu'il me
retourne un compte de 1 pour une ligne qui se trouve dans les résultats
grâce au LEFT JOIN (dans le cas d'un client sans prêt), ce qui est faux en
réalité. Ma requête tente de compter le nombre de prêts pour tous les
clients, certains étant dans les résultats en n'ayant aucun prêt... donc un
compte de 0...

J'espère que ça éclaire un peu... Merci encore !



Oups autant pour moi ! et ta précision a croisé ma réponse.
Dans ce cas (syntaxe Oracle)
SELECT TABLE1.CODCLI,TABLE1.NOMCLI,SUM(DECODE(TABLE2.IT2,NULL,0,1))
SUM(IFNULL(TABLE2.IDT2 FROM TABLE1,TABLE2
WHERE TABLE1.IDT1=TABLE2.IDT2(-)
GROUP BY TABLE1.CODCLI,TABLE1.NOMCLI

en mySQL
SELECT TABLE1.CODCLI,TABLE1.NOMCLI,SUM(IF(TABLE2.IT2 IS NULL,0,1))
SUM(IFNULL(TABLE2.IDT2 FROM TABLE1,TABLE2
WHERE TABLE1.IDT1=TABLE2.IDT2(-)
GROUP BY TABLE1.CODCLI,TABLE1.NOMCLI

Pour SQLserver, je ne sais pas quelle est la syntaxe
A tester

--
Eric Roumegou
http://cerbermail.com/?Wk2D8D62KI
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou
décidément ! Il fallait Lire TABLE2.IDT2 qui est l'identifiant de ma
table fils, et si elle est à null
c'est qu'il y a non concordance donc 0 sinon 1 et je somme en group by

SELECT TABLE1.CODCLI,TABLE1.NOMCLI,SUM(DECODE(TABLE2.IT2,NULL,0,1))
SUM(IFNULL(TABLE2.IDT2 FROM TABLE1,TABLE2
WHERE TABLE1.IDT1=TABLE2.IDT2(-)
GROUP BY TABLE1.CODCLI,TABLE1.NOMCLI

en mySQL
SELECT TABLE1.CODCLI,TABLE1.NOMCLI,SUM(IF(TABLE2.IT2 IS NULL,0,1))
SUM(IFNULL(TABLE2.IDT2 FROM TABLE1,TABLE2
WHERE TABLE1.IDT1=TABLE2.IDT2(-)
GROUP BY TABLE1.CODCLI,TABLE1.NOMCLI

Pour SQLserver, je ne sais pas quelle est la syntaxe
A tester



En espèrant t'avoir aidé.
Eric

--
Eric Roumegou
http://cerbermail.com/?Wk2D8D62KI
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou
décidément ! Il fallait Lire TABLE2.IDT2 qui est l'identifiant de ma
table fils, et si elle est à null
c'est qu'il y a non concordance donc 0 sinon 1 et je somme en group by
En plus, il y avait 2 fois le SUM

Bon c'est vendredi soir hein, faut pas trop être exigeant !
"Roumegou" avait prétendu :
SELECT TABLE1.CODCLI,TABLE1.NOMCLI,SUM(DECODE(TABLE2.IDT2,NULL,0,1))
FROM TABLE1,TABLE2
WHERE TABLE1.IDT1=TABLE2.IDT2(-)
GROUP BY TABLE1.CODCLI,TABLE1.NOMCLI

en mySQL
SELECT TABLE1.CODCLI,TABLE1.NOMCLI,SUM(IF(TABLE2.IDT2 IS NULL,0,1))
FROM TABLE1,TABLE2
WHERE TABLE1.IDT1=TABLE2.IDT2(-)
GROUP BY TABLE1.CODCLI,TABLE1.NOMCLI

Pour SQLserver, je ne sais pas quelle est la syntaxe
A tester


Eric

--
Eric Roumegou
http://cerbermail.com/?Wk2D8D62KI
(cliquez sur le lien ci-dessus pour me contacter en privé)