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

Développement SQL Server Discussion :

Case when dans la clause on


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut Case when dans la clause on
    Bonjour,

    j'ai écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select top 10 que.QUE_ID, que.CUS_ID, max(qin.TARIF), max(cus.CUS_TARIFLEVEL)
    from QUE_QUERY que
    	inner join COW_CONTRACTOWNER cow
    		on cus.COW_ID = cow.COW_ID
    	inner join QIN_QUERYINPUT
    		on case cow.COW_LABEL when 'EAF' then (que.QUE_ID = qin.QUE_ID)
    			else (que.qin_id = qin.qin_id) end
    Dans le cas "MAX", on prend une jointure vers N lignes de QIN pour sortir le maximum de TARIF, et dans les autres cas, on joint vers une seule ligne de QIN pour le TARIF choisi... Hélas, ceci ne semble pas fonctionner, cette syntaxe est incorrecte...
    Incorrect syntax near '='.
    Quelqu'un a une idée s'il-vous-plait ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    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 top 10 que.QUE_ID, que.CUS_ID, 
           max(qin.TARIF), max(cus.CUS_TARIFLEVEL)
    FROM QUE_QUERY que
    	INNER JOIN COW_CONTRACTOWNER cow
    		ON cus.COW_ID = cow.COW_ID
    	INNER JOIN QIN_QUERYINPUT
    		ON  case cow.COW_LABEL
    		       when 'EAF' 
    		           then que.QUE_ID
    			   else     que.qin_id
    			end = case cow.COW_LABEL
    		             when 'EAF' 
    		                then quin.QUE_ID
    			         else    quin.qin_id
    			       end
    Au passage il vous manque certainement des GROUp BY !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Une autre méthode qui pourrait profiter d'eventuels index, à vérifier quand même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT TOP 10
        que.QUE_ID,
        que.CUS_ID,
        max(qin.TARIF),
        max(cus.CUS_TARIFLEVEL)
    FROM
        QUE_QUERY as que
        INNER JOIN COW_CONTRACTOWNER as cow
          ON cus.COW_ID = cow.COW_ID
        INNER JOIN QIN_QUERYINPUT as qin
          ON (cow.COW_LABEL  = 'EAF' AND que.QUE_ID = qin.QUE_ID)
          OR (cow.COW_LABEL <> 'EAF' AND que.qin_id = qin.qin_id)
    ...

  4. #4
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    J'utilisais la 2ème méthode, mais elle semble longue à cause du "OR"... Alors je voulais essayer avec les CASES.

    Et pour les group by, effectivement, mais c'est parce que la requête est beaucoup plus longue et que je n'ai mis que la partie pertinente.

    Merci beaucoup à vous deux !

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il se peut que vous ayez de meilleurs performances en utilisant deux jointures externes, à essayer :
    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
    SELECT TOP 10
        que.QUE_ID,
        que.CUS_ID,
        max(coalesce(qin1.TARIF, qin2.TARIF)),
        max(cus.CUS_TARIFLEVEL)
    ...
    FROM
    ...
        QUE_QUERY as que
        INNER JOIN COW_CONTRACTOWNER as cow
          ON cus.COW_ID = cow.COW_ID
        LEFT OUTER JOIN QIN_QUERYINPUT as qin1
          ON que.QUE_ID = qin1.QUE_ID
         AND cow.COW_LABEL  = 'EAF'
        LEFT OUTER JOIN QIN_QUERYINPUT as qin2
          ON que.qin_id = qin2.qin_id
         AND cow.COW_LABEL <> 'EAF'
    ...
    Voire :
    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
    SELECT TOP 10
        que.QUE_ID,
        que.CUS_ID,
        max(case cow.COW_LABEL when 'EAF' then qin1.TARIF else qin2.TARIF end),
        max(cus.CUS_TARIFLEVEL)
    ...
    FROM
    ...
        QUE_QUERY as que
        INNER JOIN COW_CONTRACTOWNER as cow
          ON cus.COW_ID = cow.COW_ID
        LEFT OUTER JOIN QIN_QUERYINPUT as qin1
          ON que.QUE_ID = qin1.QUE_ID
        LEFT OUTER JOIN QIN_QUERYINPUT as qin2
          ON que.qin_id = qin2.qin_id
    ...

  6. #6
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    En fait, la meilleure option que j'ai trouvée est de faire les 2 requêtes avec un union... Je passe de 10 minutes à 0 secondes...

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

Discussions similaires

  1. CASE WHEN dans un trigger
    Par artmicro dans le forum SQLite
    Réponses: 0
    Dernier message: 27/05/2012, 18h51
  2. CASE WHEN dans clause WHERE
    Par SpaceFrog dans le forum Requêtes
    Réponses: 13
    Dernier message: 20/11/2009, 14h23
  3. Réponses: 2
    Dernier message: 30/01/2008, 15h38
  4. Access et SELECT CASE WHEN dans requetes
    Par Orion01 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/12/2007, 11h24
  5. Réponses: 7
    Dernier message: 29/05/2007, 10h21

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