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 :

[SQL2005] Raccourci pour expressions similaires


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut [SQL2005] Raccourci pour expressions similaires
    Est-il possible d'utiliser directement un résultat que l'on vient de calculer pour une autre expression ?
    Voici un exemple plus explicite de ma question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  C1 + C2 AS [addition_1],
    	[addition1] + C3 AS [addition_2]
     
    FROM	my_table


    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  C1 + C2 AS [addition_1],
    	C1 + C2 + C3 AS [addition_2]
     
    FROM	my_table



    Le but serait d'utiliser une fonction raccourci qui permettrait d'éviter de réecrire l'expression entière.

    Merci pour votre aide.

  2. #2
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Directement dans le select, non? Mais vous pouvez utiliser une CTE (à partir de SQL 2005) pour pré-calculer votre premier résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    with t (somme) AS (
    	select 
    	 1 + 1 as somme
     )
    select 
    	somme
    	,somme + 1
    from t

  3. #3
    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

    "directement", non.

    par contre vous pouvez faire ceci :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT addition1, addition1 + C3 AS addition2
    FROM
    (
      SELECT C1 + C2  AS addition1, C3
      FROM MaTable
    ) AS tmp

    Mais je ne vois pas l'intérêt

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut
    Bonsoir,

    n'y a t'il aucun moyen de faire ceci sans modifier la clause FROM ?
    Car dans ma query initiale, j'ai déjà plusieurs join qui s'y affère. Dès lors, je commence à m'emmeler.

    L'intêret est d'allléger/améliorer la visibilité de ma query.
    Je vous ai donné ici un exemple simple, mais ma query est bien plus complexe.

  5. #5
    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
    Puisque vous semblez être en 2005, et si votre but est d'améliorer la lisibilité de votre requete, alors la solution de Jinroh77 est surement ce qu'il vous faut !

    En gros dans votre cas cela revient a définir avant la requete elle même des résultats intermédiaires. Vous vous y retrouverez donc facilement dans la requete par la suite.

    En fonction de vos besoins, une vue pourrait aussi être une solution adaptée


    Enfin, mais cela n'engage que moi, dans votre question initiale, je trouve que votre deuxième requete, bien indentée, est bien plus lisible que la première !
    En effet, on voit très vite que la deuxième ligne du SELECT reprend la première...

    Effectivement, si votre requete est vraiment très compliquée, avec de nombreux calculs imbriqués, alors passez soit par une CTE, soit par une vue(qui en plus pourra peut être être indexée par la suite pour améliorer les performances de votre requete)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut
    Merci pour vos suggestions.
    Dès lors, pourrai-je vous demander comment vous simplifieriez ce code ci-dessous svp ?!

    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
    SELECT
     
    CASE WHEN condition1 THEN 0
         ELSE
    	     CASE WHEN condition2 THEN 0
                      WHEN condition3 THEN 1					
                      WHEN condition4 THEN 1
    		  ELSE 0
    	     END
    END AS [C1],
     
     
    CASE WHEN condition1 THEN 0	
         ELSE
    	     CASE WHEN condition 5 THEN 0
    		  ELSE 
    	              CASE WHEN condition2 THEN 0
                               WHEN condition3 THEN 1
                               WHEN condition4 THEN 1
                               ELSE 0
    		      END
    	     END
    END AS [C2],
     
    et ainsi de suite..
     
    FROM my_table
    Merci d'avance.

  7. #7
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    La valeur de C2 utilise dans son CASE WHEN la valeur de C1 ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par Jinroh77 Voir le message
    La valeur de C2 utilise dans son CASE WHEN la valeur de C1 ?
    Oui !
    Et la valeur de C3 dépend de la valeur de C2, et ainsi de suite.
    Chacune de mes colonnes dépendent des colonnes précédentes, auxquelles j'ajoute des conditions supplémentaires.

  9. #9
    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
    Tu peux aussi utiliser les UDF...
    La ta requete pourra vraiment être plus lisible surtout si tu met de la logique métier, ca peut être aussi une bonne solution

    Mais tu a besoin des résultats intermédiaires au final, ou c'est juste pour vérifier que ta requete fonctionne bien, et donc avoir les différentes étapes pour debugguer ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Mais tu a besoin des résultats intermédiaires au final, ou c'est juste pour vérifier que ta requete fonctionne bien, et donc avoir les différentes étapes pour debugguer ?
    J'ai besoin de toutes les étapes dans mon résultat.
    Je suis novice, mais je souhaite en apprendre tous les jours.
    UDF ? je vais checker ca, mais pour info..

    je DOIS avoir tout mon code dans une seule et même reqûete.

    Merci d'avance

  11. #11
    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
    Citation Envoyé par apnw7931 Voir le message
    je DOIS avoir tout mon code dans une seule et même reqûete.
    C'est a dire ?
    tu veux récupérer tes résultats en une seule requete ?
    ou tu veux toute la logique de calcul dans une seule requete SQL ? dans ce cas pourquoi ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    C'est a dire ?
    tu veux récupérer tes résultats en une seule requete ?
    ou tu veux toute la logique de calcul dans une seule requete SQL ? dans ce cas pourquoi ?
    Je souhaite tout avoir dans une seule reqûete, sans créer de procédures ou de fonctions qui viendraient écrire dans la base de données. En effet, je n'ai qu'un accès 'Read Only' à la Data Warehouse. J'espere que je me suis mieux fait comprendre.

    Sinon, pour en revenir à mon exemple, je peux l'expliquer d'une autre manière.
    Je souhaiterai savoir comment faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (CASE xxx WHEN xxx THEN xxx ELSE xxx END) AS [C1],
    (CASE [C1] WHEN xxx ...) as [C2],
    etc..

  13. #13
    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
    les fonctions en question n'ecriraient pas dans la base de données, et ne lirait pas non plus d'ailleurs. Elles pourraient simplement prendre en parametre les données que tu traitera dans ton SELECT, et effectuer le calcul dessus.(tu pourrait juste encapsuler tes case dans ces fonctions)

    Par contre effectivement il te faudra les privilèges de création pour les fonctions... puis les privilèges pour les exécuter...

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut
    Vois-tu alors une solution à mon problème ?!

  15. #15
    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
    Citation Envoyé par apnw7931 Voir le message
    je n'ai qu'un accès 'Read Only' à la Data Warehouse

    Vois-tu alors une solution à mon problème ?!

    J'en vois plusieurs :
    1/ demander au DBA de faire son travail.
    2/ demander au DBA de te donner les privilèges nécessaires pour que tu puisse faire son travail
    3/ revenir a la solution des CTE, voire ta solution initiale, car après tout il ne s'agit ici que d'un problème de lisibilité!
    comme je le disais plus haut, une requete bien indentée peu rester lisible même avec plusieurs imbrications de CASE...

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut
    je vais donc devoir opter pour l'option numéro 3 : CTE.

    Par contre, pourrais-je abuser de vos aides pour me réécrire ces lignes de code, mais avec l'utilisation d'un WITH ?!
    Etant novice, je vais prendre beaucoup de temps pour le faire (mais j'essaye quand même dès la fin de mon message).
    Je vous en serais reconnaissant.

    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
    ELECT
     
    CASE WHEN condition1 THEN 0
         ELSE
    	     CASE WHEN condition2 THEN 0
                      WHEN condition3 THEN 1					
                      WHEN condition4 THEN 1
    		  ELSE 0
    	     END
    END AS [C1],
     
     
    CASE WHEN condition1 THEN 0	
         ELSE
    	     CASE WHEN condition 5 THEN 0
    		  ELSE 
    	              CASE WHEN condition2 THEN 0
                               WHEN condition3 THEN 1
                               WHEN condition4 THEN 1
                               ELSE 0
    		      END
    	     END
    END AS [C2],
     
    et ainsi de suite..
     
    FROM my_table

  17. #17
    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
    Si condition1 correspond a col1 = UnGrosCalcul(col2, col3)

    Alors, tu dois fauire quelque chose du genre

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    WITH intermediare(UnGrosResultat) AS (
        SELECT ID, UnGrosCalcul(col2,col3)
        FROM MaTable
    )
    SELECT
        CASE WHEN Col1 = intermediaire.UnGrosResultat THEN 0
            ELSE CASE... END
        END,
        CASE WHEN Col1 = intermediaire.UnGrosResultat THEN 0 
            ELSE CASE ... END
        END,
    ...
    FROM MaTable
    INNER JOIN intermediaire ON MaTable.ID = intermediaire.ID

    Tu pourrai aussi ajouter les autres calculs de la même façon (condition2, condition3, et condition4), mais tu risque de faire pas mal de calculs inutiles (si condition1 est vrai tout le temps, les calculs pour condition2, condition3 et condition4 ne seront jamais effectués, et condition5 ne sera même jamais évaluée), donc tu risque de perdre pas mal en performance.

    Dans ce cas, il faudra faire une deuxième CTE, avec une jointure sur la première et une clause WHERE du type
    WHERE NOT col1 = intermediare.UnGrosResultat

    et ainsi de suite

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Points : 59
    Points
    59
    Par défaut
    Merci beaucoup. Je vais essayer de chipoter et d'arriver à mon résultat avec ceci.

    Sinon, parrallèlement, je n'arrive pas à joindre correctement ceci.
    J'aimerai avoir la somme de chacun des WITH.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH
    a (TEST1) AS (SELECT column1 FROM my_table),
    b (TEST2) AS (SELECT column2 FROM my_table)
     
    SELECT	SUM(TEST1),
            SUM(TEST2)
     
    FROM	??

  19. #19
    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
    comme ceci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    WITH
    a (TEST1) AS (SELECT column1 FROM my_table),
    b (TEST2) AS (SELECT column2 FROM my_table)
     
    SELECT SUM(TEST1),
         (SELECT SUM(TEST2) FROM b)
    FROM	a

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

Discussions similaires

  1. Raccourci pour nom avec formattage
    Par jackrabbit dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 29/09/2006, 22h31
  2. question sur le raccourci pour la sécurité
    Par yoyoo dans le forum Sécurité
    Réponses: 6
    Dernier message: 08/08/2006, 10h58
  3. aide pour expression réguliere
    Par guiillaume63 dans le forum Langage
    Réponses: 11
    Dernier message: 23/06/2006, 21h15
  4. [Raccourci] Creer un raccourci pour System.out.println()
    Par VlaMonPseudo dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 11/04/2006, 14h48
  5. Synthaxe pour expression comprenant quote avec commande like
    Par loopy4321 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/07/2004, 12h21

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