2017-09-29 1 views
1

J'ai deux tables, l'une contient une liste d'employés, l'autre contient une liste de PO.TSQL tirant des enregistrements de deux tables qui ne sont pas dans la parité

Le tableau PO ressemble:

PoID PO# Name    City  State 
1 55 Jasons Company Miami FL 
2 66 Mikes Company NewYork NY 
3 77 Sallys Company Dallas TX 

Mes employés Tableau ressemble:

EmployeeID Name Phone   Email PoID 
1   John 123-123-1233 [email protected] 1 
2   Alex 234-234-2344 [email protected] 1 
3   Cindy 345-345-3455 [email protected] 2 
4   Jessica 356-356-3566 [email protected] 3 

Maintenant, si mon instruction SQL Select est la suivante:

SELECT * FROM PO p 
LEFT JOIN Employees e 
ON p.PoID = e.PoID 

Il retournera tous enregistrements dans ma table PO et peut-être juste l'entrée supérieure de tout employé associé à cet enregistrement. J'ai besoin que les noms/e-mails de tous les enregistrements associés soient également extraits. Je ne suis pas sûr de la façon dont je peux accomplir cela car je ne veux pas d'entrées de commande d'achat en double, mais plutôt une liste délimitée par des virgules des éventuels noms/e-mails associés à ce PO pour afficher deux colonnes supplémentaires sur mon PO.

Espérons que cela a du sens, si quelqu'un est tombé sur ceci votre point de vue est apprécié.

Répondre

2

Vous pouvez essayer cette requête

SELECT p.*, 
STUFF((SELECT DISTINCT ',' + Name 
      FROM @Employees e1 
      WHERE e1.PoID = p.PoID 
      FOR XML PATH ('')) 
      , 1, 1, '') AS Names 
,STUFF((SELECT DISTINCT ',' + Phone 
      FROM @Employees e1 
      WHERE e1.PoID = p.PoID 
      FOR XML PATH ('')) 
      , 1, 1, '') AS Phones 
,STUFF((SELECT DISTINCT ',' + Email 
      FROM @Employees e1 
      WHERE e1.PoID = p.PoID 
      FOR XML PATH ('')) 
      , 1, 1, '') AS Emails 
FROM @PO p 

Résultat

enter image description here

Ci-dessous vous pouvez voir le script entier avec des données de test

declare @po table(PoID int, PO int, Name varchar(100),City varchar(100),State varchar(100)) 

insert into @po 
select 1,55,'Jasons Company','Miami','FL' union 
select 2,66,'Mikes Company','NewYork','NY' union 
select 3,77,'Sallys Company','Dallas','TX' 

declare @Employees table(EmployeeID int, Name varchar(100),Phone varchar(100),Email varchar(100), PoID int) 

insert into @Employees 
select 1,'John','123-123-1233','[email protected]',1 union 
select 2,'Alex','234-234-2344','[email protected]',1 union 
select 3,'Cindy','345-345-3455','[email protected]',2 union 
select 4,'Jessica','356-356-3566','[email protected]',3 

SELECT p.*, 
STUFF((SELECT DISTINCT ',' + Name 
      FROM @Employees e1 
      WHERE e1.PoID = p.PoID 
      FOR XML PATH ('')) 
      , 1, 1, '') AS Names 
,STUFF((SELECT DISTINCT ',' + Phone 
      FROM @Employees e1 
      WHERE e1.PoID = p.PoID 
      FOR XML PATH ('')) 
      , 1, 1, '') AS Phones 
,STUFF((SELECT DISTINCT ',' + Email 
      FROM @Employees e1 
      WHERE e1.PoID = p.PoID 
      FOR XML PATH ('')) 
      , 1, 1, '') AS Emails 
FROM @PO p 
+0

merci c'est exactement ce que je recherchais à faire en utilisant 'FOR XML path' – UserSN

2

Vous pouvez l'utiliser.

DECLARE @PO TABLE (PoID INT, PO INT, Name VARCHAR(20), City VARCHAR(20), State vARCHAR(10)) 
INSERT INTO @PO 
VALUES 
(1, 55, 'Jasons Company','Miami','FL'), 
(2, 66, 'Mikes Company','NewYork','NY'), 
(3, 77, 'Sallys Company','Dallas','TX') 

DECLARE @Employees TABLE (EmployeeID INT, Name VARCHAR(20), Phone VARCHAR(20), Email VARCHAR(20), PoID INT) 
INSERT INTO @Employees 
VALUES 
(1,'John','123-123-1233','[email protected]',1), 
(2,'Alex','234-234-2344','[email protected]',1), 
(3,'Cindy','345-345-3455','[email protected]',2), 
(4,'Jessica','356-356-3566','[email protected]',3) 



SELECT 
    *, 
    STUFF ((SELECT 
      ', ' + Name + '/' + Email 
     FROM 
      @Employees e WHERE e.PoID = p.PoID FOR XML PATH('')) ,1,1,'') [names/emails] 
FROM 
    @PO p 

Résultat

PoID  PO   Name     City     State  names/emails 
----------- ----------- -------------------- -------------------- ---------- ------------------- 
1   55   Jasons Company  Miami    FL   John/[email protected], Alex/[email protected] 
2   66   Mikes Company  NewYork    NY   Cindy/[email protected] 
3   77   Sallys Company  Dallas    TX   Jessica/[email protected] 
+0

vous remercie d'avoir répondu à ma question. J'ai déjà accepté la réponse précédente si je pouvais faire les deux je le ferais. Je verrai dans le vôtre que vous avez combiné des noms avec des courriels, ce qui est intéressant. Je vous remercie. – UserSN