2
votes

Afficher vide si le client ne fait pas partie du groupe

  • Client c (clé primaire = ID)
  • CustomerGroup cg (Foreign Key = CustID)
    • Client - ID, nom
    • ID de groupe de clients, ID de client, nom

    Champs à récupérer

    c.Name, cg.Name

    Problème

    Je souhaite afficher tous les clients appartenant à un groupe appelé "Ventes" et afficher la valeur "Ventes" dans cg.Name. Mais alors, tout client qui ne fait pas partie d'un groupe appelé "Ventes", affiche le nom du client, mais laisse le nom du groupe "vide".

    Essayé

    SELECT c.Name, cg.Name, [NotInGroup].group
    FROM Customer c
    LEFT JOIN CustomerGroup cg on cg.CustID= c.ID
    OUTER APPLY(
    SELECT c2.Name, cg2.Name as [group]
    FROM Customer c2
    LEFT JOIN CustomerGroup cg2 on cg2.CustID= c2.ID
    WHERE cg1.Name != 'Sales'
    ) as [NotInGroup]
    WHERE cg.Name = 'Sales'
    

    Résultat souhaité

    • Client 1 "Ventes"
    • Client 2 "Ventes"
    • Client 3 ''
    • Client 4 ''
    • Client 5 "Ventes"

    Merci d'avance.


    1 commentaires

    Alors, quel est le problème avec le SQL que vous avez maintenant, à part que [NotInGroup] .group générera une erreur car GROUP est un mot réservé dans SQL Server et le groupe n'est pas entre guillemets; Je déconseille d'utiliser des mots réservés (et même clés) pour les noms / alias d'objet. De plus, vous utilisez un LEFT JOIN mais en référençant la colonne dans le WHERE , donc en les transformant implicitement en un INNER JOIN (supposer que cela pourrait être ton problème).


    4 Réponses :


    0
    votes
    SELECT c.Name, CASE WHEN cg.Name ='Sales' the 'Sales' else '' end
    FROM Customer c
    LEFT JOIN CustomerGroup cg on cg.ID = c.ID
    

    0 commentaires

    2
    votes

    Une méthode utilise une jointure gauche :

    SELECT c.Name, cg.Name, 
    FROM Customer c LEFT JOIN
         CustomerGroups cg
         ON cg.custid = c.id AND
            cg.Name = 'Sales';
    

    Notez que le filtrage sur Ventes va dans le ON code> clause. Ceci est important, à moins que vous ne souhaitiez une ligne distincte pour chaque client et chaque groupe auquel appartient le client.

    Notez également les conditions de participation.


    1 commentaires

    A travaillé comme un charme. Solution simple mais n'y pensait tout simplement pas de la bonne manière. Merci encore.



    0
    votes
    SELECT c.[Name]
           ,ISNULL(cg.[Name],'') AS GroupName
    FROM Customer c
    LEFT JOIN CustomerGroup cg ON cg.ID = c.ID AND cg.[Name] = 'Sales'
    

    0 commentaires

    0
    votes

    Utilisez simplement une jointure gauche et coalesce().

    SELECT c.name,
           coalesce(cg.name, '')
           FROM customer c
                LEFT JOIN customergroup cg
                          ON cg.id = c.id
                             AND cg.name = 'Sales';
    

    Cependant, je ne suis pas sûr que customergroup.id se réfère customer.id . Vous devrez peut-être remplacer cg.id par la colonne référençant réellement le client.


    0 commentaires