2014-07-21 4 views
1

Disons que j'ai quelques informations comme les suivantes:SQL logique conditionnelle

First_Name Last_Name Title   Branch Location 
John  Johnson Manager   NY 
Jack  Smith  Internet Manager NY 
Chris  Jones  Internet Manager NY 
Harold  O'Reilly Executive  NY 
Liz  Young  Manager   WA 
Trey  Ritter Manager   WA 
Rick  Morgan Executive  NC 
Allison Hubbard Internet Manager NC 
Holly  Dietz  Executive  FL 

Je veux la logique suivante appliquée:

  • S'il y a un gestionnaire d'Internet présente à un endroit, l'autre les enregistrements (exec manager) peuvent être supprimés. S'il y a plus d'un gestionnaire d'Internet, préservez ces enregistrements.

  • S'il n'y a pas de gestionnaire internet

    • S'il y a au moins un gestionnaire présent à un endroit, conserver les enregistrements et supprimer les enregistrements exec.
    • S'il n'y a aucun enregistrement de gestionnaire, conservez les enregistrements exec.

Donc, en substance, le résultat devrait ressembler à:

First_Name Last_Name Title   Branch Location 
Jack  Smith  Internet Manager NY 
Chris  Jones  Internet Manager NY 
Liz  Young  Manager   WA 
Trey  Ritter Manager   WA 
Allison Hubbard Internet Manager NC 
Holly  Dietz  Executive  FL 

Je sais que je vais probablement utiliser une condition EXISTS ou quelque chose à cet effet, mais je ne suis pas sûr où commencer. Comment puis-je obtenir la sortie requise?

+0

S'il y a deux (ou plus) gestionnaires d'Internet, vous voulez les cadres et les gestionnaires d'Internet mais pas les gestionnaires? Est-ce exact? – Jenn

+0

@Jenn Non - s'il y a au moins un gestionnaire Internet, je veux ces enregistrements (d'un certain nombre de gestionnaires Internet). Les execs et les gestionnaires peuvent être supprimés. J'espère que cela clarifie un peu. – Ryan

+0

Pouvez-vous supprimer Harold O'Reilly de votre jeu de résultats alors? – Jenn

Répondre

2

Je regarde ce problème avec les étapes suivantes:

  1. Trouver le plus haut titre de priorité pour chaque branche
  2. Trouver tous les noms qui correspondent à la plus haute priorité disponible pour chaque branche

Ainsi, en commençant par l'étape 1:

select Branch_Location, 
    [titleFlag] = min(case 
         when Title='Internet Manager' then 1 
         when Title='Manager' then 2 
         when Title='Executive' then 3 
         else 999 
        end) 
from table 
group by Branch_location 

Ensuite, utilisez l'étape 1 comme su bquery sur une jointure (je vais utiliser une déclaration CTE pour séparer):

;with bestTitle as (
    select Branch_Location, 
    [titleFlag] = min(case 
         when Title='Internet Manager' then 1 
         when Title='Manager' then 2 
         when Title='Executive' then 3 
         else 999 
         end) 
    from table 
    group by Branch_location 
) 
select n.* 
from table n 
    join bestTitle t on n.Branch_Location=t.Branch_Location 
        and n.Title = case t.titleFlag 
            when 1 then 'Internet Manager' 
            when 2 then 'Manager' 
            when 3 then 'Executive' 
            else 'This is an unknown condition...' 
           end 

Comme vous pouvez le voir, je ne l'utilise pas vraiment une déclaration if, mais plutôt une déclaration case pour pouvoir commander correctement/donne la priorité au titre. À partir de là, la sous-requête de l'étape 1 détermine ce qu'il faut rechercher pour chaque branche, et la requête externe de l'étape 2 trouve les enregistrements qui répondent à ces conditions.

+0

Merci! Cette ligne de pensée est précisément ce que je cherchais. J'apprécie également les explications - très utiles. – Ryan

+0

@Ryan, je suis content que ce fut utile. Il convient également de noter qu'il existe de nombreuses façons de résoudre ce problème, certaines étant meilleures que d'autres en fonction de la structure exacte des tableaux et d'autres détails. – chezy525