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

MS SQL Server Discussion :

Aide à l'amélioration d'une requête [2012]


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Aide à l'amélioration d'une requête
    Bonjour à tous
    J’espère que vous pouvez m’aider à améliorer cette requête, je m’explique, j’ai trois tables sont :

    TYPE_OPERATION (CODE, INTITULE) : Contient les types des opérations.

    OPERATIONS (NOP, CODE, DEBIT, CREDIT) : Contient toutes les opérations imputées dans un compte
    NOP : N° d’opération
    CODE : Code de l’opération qui doit être existé dans la table TYPE_OPERATION
    DEBIT : Montant mouvementé au débit
    CREDIT : Montant mouvementé au crédit.

    TB_CUMULES (CODE, INTITULE, INIT_DEBIT, INIT _CREDIT, MDEBIT, MCREDIT, SDEBIT, SCREDIT) : C’est l'objet de ma requête, dont je dois récupérer les totaux des mouvements initiaux, mouvements imputés au débit, mouvements imputés au crédit et les soldes de chaque type d’opérations
    CODE : Code de l’opération que je le récupérer de la table OPERATIONS
    INTITULE : Intitulé de l’opération que je dois la récupérer de la table TYPE_OPERATION
    INIT_DEBIT : ne reçoit que les totaux du débit de chaque type d’opération dont le numéro d’opération est (0)
    INIT _CREDIT : ne reçoit que les totaux du crédit de chaque type d’opération dont le numéro d’opération est (0)
    MDEBIT : ne reçoit que les totaux du débit de chaque type d’opération dont le numéro d’opération est supérieur de (0)
    MCREDIT : ne reçoit que les totaux du crédit de chaque type d’opération dont le numéro d’opération est supérieur de (0)

    Et à partir de ce calcul je détermine les soldes :
    Si (INIT_DEBIT + MDEBIT) > (INIT_CREDIT – MCREDIT) Alors SDEBIT qui reçoit le solde
    Si non SCREDIT qui reçoit le solde et si le solde est NULL donc (0).

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
     
    -------- Vider la table CUMULES
    TRUNCATE TABLE TB_CUMULES;
     
    -------- Insérer les types d'opérations
    INSERT 
    INTO TB_CUMULES 
    SELECT DISTINCT M.CODE,
       P.INTITULE,
       0,
       0,
       0,
       0,
       0,
       0 
    FROM 	OPERATIONS M INNER JOIN TYPE_OPERATION P ON (P.CODE = M.CODE) 
    ORDER BY 	M.CODE ASC;
     
    --------- Insérer les totaux
    UPDATE B 
    SET B.INIT_DEBIT = (CASE WHEN (
                               SELECT SUM(DEBIT)
                                  FROM OPERATIONS M 
                               WHERE (M.NOP = 0) 
                               AND (M.CODE = B.CODE)
                               ) IS NOT NULL THEN 
                               (SELECT SUM(DEBIT)
                                   FROM OPERATIONS M 
                                WHERE (M.NOP = 0) 
                                AND (M.CODE = B.CODE)
                               ) ELSE 0 END), 
         B.INIT_CREDIT = (CASE WHEN (
                                 SELECT SUM(CREDIT)
                                    FROM OPERATIONS M 
                                 WHERE (M.NOP = 0) 
                                 AND (M.CODE = B.CODE)
                                 ) IS NOT NULL THEN 
                                 (SELECT SUM(CREDIT)
                                    FROM OPERATIONS M 
                                 WHERE (M.NOP = 0) 
                                 AND (M.CODE = B.CODE)
                                 ) ELSE 0 END), 
     
        B.MDEBIT = (CASE WHEN (
                               SELECT SUM(DEBIT)
                                  FROM OPERATIONS M 
                               WHERE (M.NOP <> 0) 
                               AND (M.CODE = B.CODE)
                               ) IS NOT NULL THEN
                               	(SELECT SUM(DEBIT)
                                  FROM OPERATIONS M 
                               WHERE (M.NOP <> 0) 
                               AND (M.CODE = B.CODE)
                               	) ELSE 0 END), 
     
        B.MCREDIT = (CASE WHEN (
                                SELECT SUM(CREDIT)
                                   FROM OPERATIONS M 
                                WHERE (M.NOP <> 0) 
                                AND (M.CODE = B.CODE)
                                ) IS NOT NULL THEN
                                (SELECT SUM(CREDIT)
                                  FROM OPERATIONS M 
                               WHERE (M.NOP <> 0) 
                               AND (M.CODE = B.CODE)
                               	) ELSE 0 END)
    FROM TB_CUMULES B;
     
    -------- Insérer les soldes
    UPDATE B 
    SET  B.SDEBIT = CASE WHEN ((B.INIT_DEBIT + B.MDEBIT) - (B.INIT_CREDIT + B.MCREDIT)) > 0 
                         THEN ((B.INIT_DEBIT + B.MDEBIT) - (B.INIT_CREDIT + B.MCREDIT)) 
                         ELSE 0 
                    END,
         B.SCREDIT = CASE WHEN ((B.INIT_CREDIT + B.MCREDIT) - (B.INIT_DEBIT + B.MDEBIT)) > 0 
                          THEN ((B.INIT_CREDIT + B.MCREDIT) - (B.INIT_DEBIT + B.MDEBIT)) 
                          ELSE 0 
                     END
    FROM TB_CUMULES B;
    ---------------------------------------
     
    SELECT  * 
    FROM 	TB_CUMULES;
    Mes remerciements d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut
    Bonjour,
    il manque des bout de requêtes. Vous utiliser un alias M qui n'est pas déclaré

  3. #3
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Donpi Voir le message
    Bonjour,
    il manque des bout de requêtes. Vous utiliser un alias M qui n'est pas déclaré
    M c'est l'alias de la table OPERATIONS

  4. #4
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Une requête comme celle-ci doit voue donner directement le résultat final. Du coup, vous pourriez supprimer votre table TB_CUMULES et la remplacer par une vue, éventuellement indexée. Ainsi, elle sera en plus toujours à jour !

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    SELECT
    	o.CODE	
    	,t.INTITULE
    	,SUM(CASE
    			WHEN o.NOP = 0 
    				THEN o.DEBIT 
    			ELSE 0
    		END
    	) AS INIT_DEBIT
    	,SUM(CASE
    			WHEN o.NOP = 0 
    				THEN o.CREDIT 
    			ELSE 0
    		END
    	) AS INIT_CREDIT
    	,SUM(CASE
    			WHEN o.NOP > 0 
    				THEN o.DEBIT 
    			ELSE 0
    		END
    	) AS MDEBIT
    	,SUM(CASE
    			WHEN o.NOP > 0 
    				THEN o.CREDIT 
    			ELSE 0
    		END
    	) AS MCREDIT
    	,CASE 
    		WHEN SUM(o.DEBIT) - SUM(o.CREDIT) > 0 
    			THEN SUM(o.DEBIT) - SUM(o.CREDIT) 
    		ELSE 0 
    	END AS SDEBIT
    	,CASE 
    		WHEN SUM(o.DEBIT) - SUM(o.CREDIT) > 0 
    			THEN 0
    		ELSE SUM(o.DEBIT) - SUM(o.CREDIT) 
    	END AS SCREDIT
    FROM OPERATIONS AS o
    INNER JOIN TYPE_OPERATION AS t
    	ON o.CODE = t.CODE
    GROUP BY 
    	o.CODE	
    	,t.INTITULE
    NB : en fonction de la possibilité d'avoir des NULL dans les colonne DEBIT et CREDIT, il faudra peut-être ajouter quelque COALESCE ci et là...

  5. #5
    Candidat au Club
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup aieeeuuuuu, c'est bien ce que je voulais faire.

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

Discussions similaires

  1. Amélioration d'une requête
    Par Redg9 dans le forum Requêtes
    Réponses: 8
    Dernier message: 29/07/2009, 11h18
  2. [AIDE] Appeler fonction dans une requête
    Par Diablo_22 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 18/03/2009, 11h11
  3. Amélioration d'une requête
    Par phtpht dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/07/2006, 12h20
  4. Aide pour établissement d'une requête
    Par Virgile59 dans le forum Access
    Réponses: 2
    Dernier message: 28/02/2006, 18h55
  5. [MySQL] Aide à la création d'une requête
    Par tom06440 dans le forum Requêtes
    Réponses: 6
    Dernier message: 19/10/2005, 22h05

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