Question

I have two three table A,B,C

A                  B                  C

ID   name          ID PID Course      ID PID Nick

1    Mark          1   1  CS           1  3   T
2    John          2   1  AI           2  3   Teddy
3    Ted           3   1  BM           3  2   J
                   4   2  PO           4  1   Mark
                   3   2  MS           5  2   Johnny

I would like the view to be like

ID   Name   Course     Nick

 1   Mark   CS,AI,BM   Mark
 2   John   PO,MS      J,Johnny
 3   Ted               T,Teddy

Is this possible using a single query?

Was it helpful?

Solution

SELECT A.ID, A.name,
STUFF(
    (
      SELECT CAST(',' as varchar(max)) + B.Course
      FROM B
      WHERE B.PID = A.ID
      ORDER BY B.Course
      FOR XML PATH('')
    ), 1, 1, '') AS Course,
STUFF(
    (
      SELECT CAST(',' as varchar(max)) + C.Nick
      FROM C
      WHERE C.PID = A.ID
      ORDER BY C.Nick
      FOR XML PATH('')
    ), 1, 1, '') AS Nick
FROM A

OTHER TIPS

CREATE VIEW vw_MyView
AS
SELECT  A.ID   
       ,A.Name
       ,STUFF((SELECT ', ' + Course
               FROM TABLE_B 
               WHERE PID = A.ID
               FOR XML PATH(''),TYPE).
               value('.','NVARCHAR(MAX)'),1,2,'') AS Courses
       ,STUFF((SELECT ', ' + Nick
               FROM TABLE_C 
               WHERE PID = A.ID
               FOR XML PATH(''),TYPE).
               value('.','NVARCHAR(MAX)'),1,2,'') AS NickName
FROM TABLE_A A 

Result Set

╔════╦══════╦════════════╦═══════════╗
║ ID ║ Name ║  Courses   ║ NickName  ║
╠════╬══════╬════════════╬═══════════╣
║  1 ║ Mark ║ CS, AI, BM ║ Mark      ║
║  2 ║ John ║ PO, MS     ║ J, Johnny ║
║  3 ║ Ted  ║ NULL       ║ T, Teddy  ║
╚════╩══════╩════════════╩═══════════╝

WORKING SQL FIDDLE

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top