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

SQL Oracle Discussion :

Ensemble GROUP BY et calcul


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Par défaut Ensemble GROUP BY et calcul
    Bonjour,

    Pourriez-vous m'apporter un peu de votre aide car la je ne comprends pas forcément tout je ce que lis et faits.
    J'explique, en se moment je me rafraichis un peu la tête sur du sql, par contre je rencontre quelques grosses difficultés sur les fonctions arithmétiques.(+,-,*,/). Je n'arrive pas à voir au-delà de l'aspect théorique...

    Je suis le tuto actuellement présent sur le site
    http://sqlpro.developpez.com/cours/sqlaz/ensembles/

    J'en suis à la clause GROUP BY (exemple 5) et aimerais reproduire, mais surtout comprendre d'une façon simple et arithmétique comment nous arrivons à obtenir le résultat (TAUX_OCCUPATION_POURCENT)

    PS : Les requêtes ce trouvent dans le lien ci-dessus.

    Ce que je ne comprends absolument pas, c'est comment de la requête 3 & 4 nous construisons et surtout obtenons le résultat (pourcentage) de la requête 5

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    -- Req 3
    SELECT SUM(CHB_PLN_CLI_NB_PERS), C.CHB_ID
    FROM   T_CHAMBRE C
           JOIN TJ_CHB_PLN_CLI P
                ON C.CHB_ID = P.CHB_ID
    WHERE  PLN_JOUR BETWEEN '1999-01-01' AND '1999-12-31'
    GROUP  BY C.CHB_ID
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    -- Req 4
    SELECT SUM(CHB_COUCHAGE) AS MAX_OCCUPATION, CHB_ID
    FROM   T_CHAMBRE C
           CROSS JOIN T_PLANNING P
    WHERE  PLN_JOUR BETWEEN '1999-01-01' AND '1999-12-31'
    GROUP  BY C.CHB_ID
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    --Req 5
    SELECT (CAST(SUM(CHB_PLN_CLI_NB_PERS) AS FLOAT) / 
            CAST(SUM(CHB_COUCHAGE) AS FLOAT)) * 100 
            	AS TAUX_OCCUPATION_POURCENT,
           C.CHB_ID
    FROM   T_CHAMBRE C
           JOIN TJ_CHB_PLN_CLI CPC
                 ON C.CHB_ID = CPC.CHB_ID
           CROSS JOIN T_PLANNING P
    WHERE  P.PLN_JOUR BETWEEN '1999-01-01' AND '1999-12-31'
    GROUP  BY C.CHB_ID
    Quelqu'un pour éclairer l'aveugle que je sembles être... ?
    Merci de votre aide et retour.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Bien vu l'aveugle ! la requête est tout simplement... fausse.

    Elle calcule le pourcentage d'occupation, toutes dates confondues, uniquement les jours où la chambre est occupée.
    Si par exemple sur 3 ans, une chambre de 4 places est occupée une seule nuit par trois personnes, la requête renverra 75%.

    De fait, la jointure croisée sur la table de planning et la restriction sont inutiles dans cette requête.

    Ceci me semblerait plus approprié pour rester dans le même esprit que les requêtes précédentes, mais d'autres solutions existent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT (CAST(SUM(COALESCE(CHB_PLN_CLI_NB_PERS, 0)) AS FLOAT) / 
            CAST(SUM(CHB_COUCHAGE) AS FLOAT)) * 100 
            	AS TAUX_OCCUPATION_POURCENT,
           C.CHB_ID
    FROM   T_CHAMBRE C
           CROSS JOIN T_PLANNING P
    			LEFT JOIN TJ_CHB_PLN_CLI CPC
    				ON C.CHB_ID = CPC.CHB_ID
    				AND P.PLN_JOUR = CPC.PLN_JOUR 
    WHERE  P.PLN_JOUR BETWEEN '1999-01-01' AND '1999-12-31'
    GROUP  BY C.CHB_ID

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Par défaut
    En effet tu as totalement raison aieeeuuuuu, la requête est fausse.

    Merci pour l'autre solution, d'autant que je galère à mort avec les fonctions !

    PS : Peut-être faudrait-il penser à corriger ce cour, une fournir une autre ressource pour s'exercer.

  4. #4
    Membre confirmé
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mai 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 75
    Par défaut Fonction Coalesce
    Bonjour,
    "Encore moi"... et encore sur le même tuto.

    Pourriez vous, s'il vous plait, sur la requête 11, m'expliquer l'intérêt du sur la fonction Coalesce ?
    J'ai bien compris l'intérêt de la fonction Coalesce, qui est de retourner le premier élément non null de la liste ou alors de le remplacer par un 0.
    Cependant je ne comprends pas pourquoi il est nécessaire au calcul "-- (quantité * montant * remise en %) - remise en francs"

    J'ai bien essayer de passer la requête sans les fonctions group by et having mais... pas plus compréhensible.

    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 F.CLI_ID,
    -- le calcul est le suivant : 
    -- (quantité * montant * remise en %) - remise en francs
    -- les colonnes "remises" pouvant avoir des valeurs NULL
    -- il faut les remplacer par un zéro à l'aide de la fonction COALESCE
           SUM(LIF_QTE * LIF_MONTANT * ((1 - COALESCE(LIF_REMISE_POURCENT/100, 0)))
                                           - COALESCE(LIF_REMISE_MONTANT, 0)) AS CA
    FROM   T_FACTURE F
           INNER JOIN T_LIGNE_FACTURE L
                 ON F.FAC_ID = L.FAC_ID
    WHERE  EXTRACT(YEAR FROM F.FAC_DATE) = 2000
    GROUP  BY C.CLI_ID
    HAVING SUM(LIF_QTE * LIF_MONTANT * ((1 - COALESCE(LIF_REMISE_POURCENT/100, 0)))
                                           - COALESCE(LIF_REMISE_MONTANT, 0)) < 15000
    Merci de votre aide et retour.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Cette dernière question est sans rapport avec le langage SQL puisqu'il s'agit juste d'arithmétique et de calcul de pourcentage.

    Soit un produit affiché 160€ sur lequel on effectue une remise de 25%.
    Le montant de la remise est de :
    remise = <prix de vente> * 25% = 160 * 25 /100 = 40.
    Le prix après remise sera donc de : <prix de vente> - <remise> = 160 - 40 = 120.

    Mais on peut effectuer ce calcul en une seule opération :
    <prix de vente> - <prix de vente> * 25% = <prix de vente> * ( 1 - 25%) = 160 * (1 - 25 / 100) !

    CQFD
    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

Discussions similaires

  1. Ensemble GROUP BY et calcul
    Par jelmouss dans le forum Oracle
    Réponses: 9
    Dernier message: 05/01/2015, 22h48
  2. [2008R2] Groupe de mesures calculées
    Par cana13 dans le forum SSAS
    Réponses: 2
    Dernier message: 26/09/2011, 11h16
  3. [CR11] Zone groupe et détails ensemble
    Par KrusK dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 29/07/2005, 11h10
  4. Théorie sur les groupes et les ensembles
    Par grav dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/02/2005, 18h24
  5. Group by à partir d'un champ calculé || substr
    Par SegmentationFault dans le forum Bases de données
    Réponses: 4
    Dernier message: 30/07/2004, 15h55

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