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

Requêtes et SQL. Discussion :

Rectification d'une requête SQL


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2013
    Messages : 35
    Points : 25
    Points
    25
    Par défaut Rectification d'une requête SQL
    Bonjour tout le monde,

    Je travaille sur une base de données qui gère les activités liées à des opérateurs du secteur des hydrocarbures (TOTAL, RIM OIL, STAR OIL, ...), et j'utilise une requête SQL pour faire le calcul d'un stock de sécurité d'essence en fonction de la date et de la quantité sortie,ce qui donne la formule suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Stock de sécurité calculé = quantité sortie (des 3 derniers mois) * 0,9
    et voici le code de la requête SQL :

    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 T1.dateAct, T1.[Nom importateur], T1.Dépôt
    (SELECT
    SUM ([QS-Essence])
    FROM [activité-importateur-oil] T2
    WHERE DateDiff("m",T2.dateAct,T1.dateAct) <4 AND dateAct<T1.dateAct)*(10/90)  AS [STS-Essence], (SELECT
    SUM ([QS-Gasoil])
    FROM [activité-importateur-oil] T2
    WHERE DateDiff("m",T2.dateAct,T1.dateAct) <4 AND dateAct<T1.dateAct)*(10/90) AS [STS-Gasoil], (SELECT
    SUM ([QS-Fuel])
    FROM [activité-importateur-oil] T2
    WHERE DateDiff("m",T2.dateAct,T1.dateAct) <4 AND dateAct<T1.dateAct)*(10/90) AS [STS-Fuel], (SELECT
    SUM ([QS-Kérosène])
    FROM [activité-importateur-oil] T2
    WHERE DateDiff("m",T2.dateAct,T1.dateAct) <4 AND dateAct<T1.dateAct)*(10/90) AS [STS-Kérosène]
    FROM [activité-importateur-oil] AS T1;
    La requête fonctionne parfaitement, mais il y a un petit soucis, c'est qu'elle calcule la somme des quantités sorties pendant les 3 derniers mois de tous les opérateurs ! alors que chaque opérateur doit avoir son propre stock.
    Comment je peux faire comprendre au système qu'il faut calculer le stock de sécurité pour chaque opérateur à part, tout en se basant sur le champ "Nom.Opérateur" ??

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    Salut AYARINHO,

    Il est préférable de présenter les requêtes avec une indentation correcte, ce qui permet une lecture simplifiée :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
    	T1.dateAct,
    	T1.[Nom importateur],
    	T1.Dépôt
    	(SELECT SUM ([QS-Essence]) FROM [activité-importateur-oil] T2 WHERE DateDiff("m",T2.dateAct,T1.dateAct) <4 AND dateAct<T1.dateAct)*(10/90)  AS [STS-Essence],
    	(SELECT SUM ([QS-Gasoil]) FROM [activité-importateur-oil] T2 WHERE DateDiff("m",T2.dateAct,T1.dateAct) <4 AND dateAct<T1.dateAct)*(10/90) AS [STS-Gasoil],
    	(SELECT SUM ([QS-Fuel]) FROM [activité-importateur-oil] T2 WHERE DateDiff("m",T2.dateAct,T1.dateAct) <4 AND dateAct<T1.dateAct)*(10/90) AS [STS-Fuel],
    	(SELECT SUM ([QS-Kérosène]) FROM [activité-importateur-oil] T2 WHERE DateDiff("m",T2.dateAct,T1.dateAct) <4 AND dateAct<T1.dateAct)*(10/90) AS [STS-Kérosène]
    FROM [activité-importateur-oil] AS T1;
    Il serait bon de préciser puisque le nom du champ est "Nom.Opérateur", le champ qui fait la jonction entre la table [activité-importateur-oil] et la table [Opérateur]

    A noter que *(10/90) n'est pas équivalent à *0,9

  3. #3
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Bonjour,

    En terme de performances, ce genre de requête va être catastrophique puisqu'il y a 4 fois le produit [activité-importateur-oil]*[activité-importateur-oil]

    En gros, si vous avez 1000 lignes dans [activité-importateur-oil], vous allez travailler sur 4 000 000 de lignes

    A mon avis, la table [activité-importateur-oil] aurait mérité à être conçue autrement avec une ligne par produit sorti plutôt qu'une colonne.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2013
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    Merci vodiem et tofalu pour ces éclaircissements, j'ai choisi de faire autrement. J'ai créé un formulaire principal à onglets qui me permet de gérer les activités de chaque opérateur à part.
    Maintenant pour ce qui est de la structure des tables, je suis d'accord avec vous tofalu. Je suis preneur de tous les conseils me permettant de partir d'un schéma bien organisé. Pour cela je pense que la structure que ma proposé "marot_r" dans cette discussion est la bonne .

    Merci encore une fois

Discussions similaires

  1. Pb sur une requête SQL (de champ vide)
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 11h12
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. Récupurer via une requête SQL la valeur la plus proche
    Par yoda_style dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/04/2004, 13h52
  4. Résultat d'une requète SQL
    Par camino dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/02/2004, 15h22
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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