IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Calcul division requete SQL Windev [WD20]


Sujet :

WinDev

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Engineering
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Engineering
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 25
    Points
    25
    Par défaut Calcul division requete SQL Windev
    Bonjour,

    Pouvez vous m'expliquer comment réaliser la division de ma 2e colonne avec la 3e dans une 4e colonne?

    Nom : REQ forum help division.PNG
Affichages : 907
Taille : 15,6 Ko

    Voici ma requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 
    	LEFT(Milking.visit_time,8) AS Jour,	
    	SUM(Milking.yield) AS ProdJour,	
    	COUNT(DISTINCT Milking.cow_nr) AS NbAnimal
    FROM 
    	Milking
    WHERE 
    	LEFT(Milking.visit_time,8) BETWEEN {DateJMoins30} AND {DateVeille}
    GROUP BY 
    	LEFT(Milking.visit_time,8)
    Cordialement.

    Yanick

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 120
    Points : 9 533
    Points
    9 533
    Par défaut
    J'imagine que tu as déjà essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
    	LEFT(Milking.visit_time,8) AS Jour,	
    	SUM(Milking.yield) AS ProdJour,	
    	COUNT(DISTINCT Milking.cow_nr) AS NbAnimal,
            SUM(Milking.yield) / COUNT(DISTINCT Milking.cow_nr)  as Division
    FROM 
    	Milking
    WHERE 
    	LEFT(Milking.visit_time,8) BETWEEN {DateJMoins30} AND {DateVeille}
    GROUP BY 
    	LEFT(Milking.visit_time,8)
    Mais je crois qu'avec HFSQL, ça ne marche toujours pas. ( Ca marcherait avec beaucoup de moteurs SQL autres que HFSQL)

    En solution de contournement, tu peux faire ainsi, et ça, je sais que ça marche
    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
     
    Select Jour, ProdJour, NbAnimal, ProdJour/NbAnimal as Division 
    FROM
    (
    SELECT 
    	LEFT(Milking.visit_time,8) AS Jour,	
    	SUM(Milking.yield) AS ProdJour,	
    	COUNT(DISTINCT Milking.cow_nr) AS NbAnimal
    FROM 
    	Milking
    WHERE 
    	LEFT(Milking.visit_time,8) BETWEEN {DateJMoins30} AND {DateVeille}
    GROUP BY 
    	LEFT(Milking.visit_time,8)
    )

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Engineering
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Engineering
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    Bonsoir Tbc92,

    Oui j'ai effectivement essayé ta première proposition (exemple forum et divers cours) mais cela me renvoie un message erreur OLE DB.
    J'essaie ta solution de contournement et te redis.

    Merci pour ton aide.

    Cordialement.

    Yanick

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 998
    Points : 2 095
    Points
    2 095
    Par défaut
    Bonjour,

    Quel est le type de base utilisé ?

    En l'occurrence, le distinct ne sert à mon avis à rien du tout la deuxième syntaxe de tbc92 me semble plutôt intéressante.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ylusson Voir le message
    Oui j'ai effectivement essayé ta première proposition (exemple forum et divers cours) mais cela me renvoie un message erreur OLE DB
    Et que dit ce message d'erreur? division par 0, je suppose?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Engineering
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Engineering
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    Bonjour a tous,

    Merci pour votre aide.

    J'ai a mon sens besoin du DISTINCT car je dois compter le nombre total d'animal différent chaque jour (sachant que le meme animal peut avoir plusieurs enregistrements par jour)

    Ma base de données est sous SQLserver2008R2.

    Quand j'éssaie la première proposition de tbc92, l'éditeur de requete Windev me souligne le SUM de la ligne division.
    Nom : REQ_TESTDIVISION tbc92 help 1 SUM souligné.PNG
Affichages : 1116
Taille : 6,4 Ko
    Et me retourne le message d'erreur suivant:
    Nom : REQ_TESTDIVISION tbc92 help 1.PNG
Affichages : 748
Taille : 11,7 Ko

    Lorsque j'éssaie la 2e proposition de tbc92, le processus de test de windev crash et renvoie le message suivant:
    Nom : REQ_TESTDIVISION tbc92 help.PNG
Affichages : 756
Taille : 13,1 Ko

    Pour le moment, j'ai crée 2 requetes différente que je divise l'une avec l'autre a l'affichage d'une ligne dans mon tableau (mais j'ai le sentiment que ca prendrait moins de temps directement dans la requete).

    Cordialement.

  7. #7
    Invité
    Invité(e)
    Par défaut
    quel est le message par rapport à l'utilisation de Milking.yield et quel est son type?

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 120
    Points : 9 533
    Points
    9 533
    Par défaut
    Je n'avais pas vu que c'était SQLServer.

    La 1ère syntaxe que je proposais est refusée par HFSQL, mais acceptée par beaucoup de moteurs SQL.
    Quand tu fais HexecuteRequete() ou HexecuteRequeteSql(), tu peux préciser le paramètre HrequeteSansCorrection. Ainsi, Windev ne va pas se poser la question de savoir si la syntaxe est compatible avec HFSQL ou pas, il va l'envoyer telle quelle à SQLServer, et ainsi, elle devrait marcher.

    Sinon, si on regarde ici : http://sqlpro.developpez.com/cours/sqlaz/sousrequetes/ , on nous dit que SQLServer sait traiter les requêtes imbriquées, mais qu'il y a un problème avec les requêtes imbriquées et l'opérateur UNIQUE.

    Donc ça risque d'être compliqué !
    Eventuellement, il faudrait soumettre la question dans un sous-forum sur SQL-Server https://www.developpez.net/forums/f4...ms-sql-server/

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Engineering
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Engineering
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    Re,

    Les 2 requetes passent correctement en faisant:
    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
    21
    22
     
    ReqHerdAVGProd est une chaîne=[
    			Select Jour, ProdJour, NbAnimal, ProdJour/NbAnimal as Division 
    			FROM
    			(
    			SELECT 
    			LEFT(Milking.visit_time,8) AS Jour,	
    			SUM(Milking.yield) AS ProdJour,	
    			COUNT(DISTINCT Milking.cow_nr) AS NbAnimal
    			FROM 
    			Milking
    			WHERE 
    			LEFT(Milking.visit_time,8) BETWEEN {DateJMoins30} AND {DateVeille}
    			GROUP BY 
    			LEFT(Milking.visit_time,8)
    			)
    		]
    		SDHerdAVGProd est une Source de Données
    		SI PAS HExécuteRequêteSQL(SDHerdAVGProd,DashBoardMaster,hRequêteSansCorrection,ChaîneConstruit(ReqHerdAVGProd,DateJMoins30,DateVeille)) ALORS
    			Erreur("Erreur d'initialisation de la requête ReqHerdAVGProd" + RC + HErreurInfo())
    			RETOUR
    		FIN
    Mon problème est que j'utilise trop l'éditeur de requete et de test de Windev je pense. Il faut que j'évolue...

    Aussi non le warning retourné par Windev lorsque je test (sous l'éditeur de requete windev) la 1e proposition de tbc92 est:
    Warning : Les fonctions agrégats (COUNT, AVG, SUM, MIN, MAX) ne sont pas autorisées en dehors des clauses SELECT ou HAVING
    REQ_TESTDIVISION, Code SQL, ligne 5, colonne 1

    Encore merci pour votre aide.

    Yanick

  10. #10
    Invité
    Invité(e)
    Par défaut
    Question : pourquoi ne pas comparer NbAnimal avec la valeur 0 ? avec l'instruction CASE, c'est possible

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Engineering
    Inscrit en
    Juillet 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Engineering
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 42
    Points : 25
    Points
    25
    Par défaut
    J'essaierai volontier... Merci

  12. #12
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 120
    Points : 9 533
    Points
    9 533
    Par défaut
    @Romulus : normalement , on est assuré de ne pas avoir de division par 0. On compte un nombre de lignes (ou un nombre de valeurs distinctes). On est donc assuré d'avoir systématiquement 1 ou plus.

    Le petit risque, c'est d'avoir des valeurs NULL dans la colonne, auquel cas, on pourrait avoir cette division par 0. Mais ici, cette colonne cow_nr semble être un identifiant, donc on est sûr que cette colonne est toujours renseignée.

    Si vraiment on veut sécuriser le truc, et prendre en compte ce cas :
    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
     
    ReqHerdAVGProd est une chaîne=[
    			Select Jour, ProdJour, NbAnimal, 
                                  case when NbAnimal > 0 then ProdJour/NbAnimal else 0 end   as Division 
    			FROM
    			(
    			SELECT 
    			LEFT(Milking.visit_time,8) AS Jour,	
    			SUM(Milking.yield) AS ProdJour,	
    			COUNT(DISTINCT Milking.cow_nr) AS NbAnimal
    			FROM 
    			Milking
    			WHERE 
    			LEFT(Milking.visit_time,8) BETWEEN {DateJMoins30} AND {DateVeille}
    			GROUP BY 
    			LEFT(Milking.visit_time,8)
    			)
    		]

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    @Romulus : normalement , on est assuré de ne pas avoir de division par 0. On compte un nombre de lignes (ou un nombre de valeurs distinctes). On est donc assuré d'avoir systématiquement 1 ou plus.
    Quand Ylusson devra déployer son projet en production, je suppose que justement, le nombre d'enregistrement sera de 0, d'où l’intérêt de mettre un minimum de sécurité

  14. #14
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 120
    Points : 9 533
    Points
    9 533
    Par défaut
    Non, même si le nombre d'enregistrements est de 0, la requête 'interne' renverra 0 lignes, et donc pas de problème.

    Ici, pour chaque ligne renvoyée par la requête interne, on fait une division. Si la requête interne renvoie 0 ligne, on ne fait aucune division , donc aucune division par 0 !

    Le seul problème, c'est si le n° de bovin cow_nr vaut NULL ( je mets bien NULL, pas nul , ni nulle, ce n'est pas une faute de frappe). Ce mot clé NULL est traité de façon très particulière dans les bases de données, et il pourrait créer une division par 0 ici.
    Mais normalement, dans la description de son fichier, notre ami a précisé qu'on ne pouvait pas écrire NULL dans la colonne cow_nr.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete sql windev
    Par Ylusson dans le forum WinDev
    Réponses: 4
    Dernier message: 09/06/2017, 14h26
  2. [Généralités] Requete SQL + windev
    Par fozzeuh dans le forum WinDev
    Réponses: 7
    Dernier message: 01/07/2011, 22h27
  3. [WinDev 10] Requête SQL - Récupérer valeur de la liste
    Par arnaud_verlaine dans le forum WinDev
    Réponses: 22
    Dernier message: 23/10/2006, 23h55
  4. Calcul BD mais dans Requete SQL
    Par forzaxelah dans le forum Bases de données
    Réponses: 5
    Dernier message: 13/05/2006, 20h35
  5. Requete SQl, calcul du solde d'un compte
    Par nerick dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/02/2006, 22h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo