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

Langage SQL Discussion :

Division sur SQL - contraintes sur dividende et diviseur


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Août 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Division sur SQL - contraintes sur dividende et diviseur
    Bonjour,

    Déjà, merci si vous êtes en train de lire ces quelques lignes.

    Voici mon problème:
    Le but est d'afficher sur un site web les résultats consolidés d'une division via requête SQL.

    Nous avons donc un périmètre qui peut être variable en fonction du choix de l'utilisateur.

    Notre problème est que si une valeur est nulle sur le dividende et/ou diviseur, nous devons exclure ce périmètre du calcul.

    Voici la requête de base :

    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
    23
    24
    25
    26
    27
    28
    SELECT DISTINCT 'Amerique' AS Zone, 
     
    ROUND(
            (
                (
                    SELECT  SUM(CAST(table.VALUE AS DECIMAL(9,4))) 
                    FROM table
                    WHERE table.ID = '"+context.ID_Dividende+"' AND table.PERIMETER_ID IN ("+context.PERIMETER_LIST+")
                    AND table.VALUE <> 'N%'
                      AND table.VALUE is not null
                      AND table.VALUE <> 0
             )
                / 
     
                (
                    SELECT  SUM(CAST(table.VALUE AS DECIMAL(9,4))) 
                    FROM table
                    WHERE table.ID = '"+context.ID_Diviseur+"' AND table.PERIMETER_ID IN ("+context.PERIMETER_LIST+")
                    AND table.VALUE <> 'N%'
                      AND table.VALUE is not null
                      AND table.VALUE <> 0
               )
            *100) , "+context.DEC+"
       ) AS PERCENT_VALUE
     
     
    FROM table 
    WHERE table.ID = '"+context.ID_Dividende+"'


    Notre problème se situe donc dans la clause WHERE sur l'argument table.PERIMETER_ID IN ("+context.PERIMETER_LIST+").
    Est-il possible de comparer les deux arguments (dividende et diviseur) entre eux grâce au SQL ?

    Voici un résumé par tableau :

    ID 1 ID 2
    10420 0 5
    10421 7 4
    10422 12 0
    10423 13 8

    Naturellement, si nous faisons la somme, nous trouvons pour chaque ID, ce qui suit, ainsi que la division.
    Somme 32 17
    ID2 / ID1 53,125%

    Nous, ce que nous cherchons, c'est d'exclure les périmètres ayant des ID à 0
    Somme
    attendue 20 12
    ID2 / ID1 60%

    Je vous remercie grandement pour votre aide en espérant avoir été suffisamment clair avec mon problème.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour et bienvenue,

    je vais tenter de donner des pistes , il y a pas mal de points dans le code fourni qui ne sont pas du SQL ce qui gâche grandement la lecture !

    - Tout d'abord il y a un DISTINCT 'Amerique' AS Zone,, pourquoi un distinct ? et pourquoi une "constante" ?
    - Je passe sur le mot clé Table utilisé, qui je l'imagine bien n'est pas le nom réel de la table
    - Ensuite WHERE table.ID = '"+context.ID_Dividende+"' AND table.PERIMETER_ID IN ("+context.PERIMETER_LIST+") même si j'ai déduit qu'il s'agissait en fait des 2 "paramètres" passés par l'utilisateur, je ne comprends pas l'intérêt du IN pour le second surtout si je m'appuie sur
    Nous avons donc un périmètre qui peut être variable en fonction du choix de l'utilisateur.
    ou seul 1 périmètre est demandé ?
    -Et enfin j'ai l'impression que l'on à faire non pas à une mais deux tables dont la jonction n'a pas été maitrisée

    Perso, j'aurai tendance à passer par des CTE mais peut être que le SGBD utilisé ne connait pas

    Je vous remercie grandement pour votre aide en espérant avoir été suffisamment clair avec mon problème.
    pour moi de n'est pas le cas. J'eusse préféré :
    • une indication du SGBD (on ne fera pas les mêmes propositions selon
    • une description de table(s) plus précise plutôt que ce qui me semble être un tableau croisé
    • la non notion de paramètres qui "pollue" dans un premier temps la requête

    en bref, avez vous lu les Règles du forum Langage SQL à lire par tous
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. Ajouter une contrainte sur SQL-Server
    Par diofilip dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/07/2011, 16h48
  2. Contraintes sur des contraintes
    Par Siali dans le forum Prolog
    Réponses: 4
    Dernier message: 25/11/2006, 09h59
  3. [Sql] contrainte sur type date
    Par zchallal dans le forum Oracle
    Réponses: 2
    Dernier message: 19/06/2006, 13h57
  4. Timeout Expiré sur SQL Serveur sur une table de la BDD
    Par Seph dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/11/2005, 10h13
  5. [SQL]Questions sur les contraintes ?
    Par patmaba dans le forum Oracle
    Réponses: 3
    Dernier message: 24/02/2005, 15h12

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