SQL: Afficher la table et son travail par oui et non

C'est ma table:

Table user

Id | Username | --------------- 1 | jdoe | 

Table des tâches

 Id | Job | ---------------- 1 | Waiter | 2 | Office | 3 | Freelance | 

Table des tâches de l'user

 Id |UserId | JobId | -------------------- 1 | 1 | 2 | 2 | 1 | 3 | 

Comment sélectionner cette table et l'afficher pour ressembler à ceci:

 Id | Username | Waiter| Office | Freelance| ------------------------------------------- 1 | jdoe | No | Yes | Yes | 

Ceci est une question de requête pivot assez standard, avec une légère torsion supplémentaire. Dans le cas où un certain type de travail n'est pas assigné à un user donné, vous voulez afficher 'No' . Une façon de faire est de faire usage de COALESCE et de replace les agrégats de travail NULL .

 SELECT u.Id, u.Username, COALESCE(MAX(CASE WHEN j.Job = 'Waiter' THEN 'Yes' END), 'No') AS Waiter, COALESCE(MAX(CASE WHEN j.Job = 'Office' THEN 'Yes' END), 'No') AS Office, COALESCE(MAX(CASE WHEN j.Job = 'Freelance' THEN 'Yes' END), 'No') AS Freelance FROM User u LEFT JOIN User_Job uj ON u.Id = uj.UserId LEFT JOIN Job j ON uj.JobId = j.Id GROUP BY u.Id, u.Username 

Essaye ça..

 WITH cte AS ( SELECT u.username,job,CASE WHEN uj.jobid IS NULL THEN 'No' ELSE 'yes' END AS jobid FROM USER u INNER JOIN UserJob uj on u.id = uj.Userid RIGHT JOIN Job j on j.id = uj.jobid ) SELECT username,ISNULL(waiter,'no') waiter, ISNULL(Office,'no') Office, ISNULL(Freelance,'no') Freelance FROM cte PIVOT ( MAX(jobid) FOR job IN (Waiter, Office,Freelance) ) piv WHERE username IS NOT NULL 
 DECLARE @cols AS NVARCHAR(MAX),@Listcols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT ',' + 'Isnull('+QUOTENAME(t.Job) +',''No'') as ' + t.Job from Job t order by Job desc FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') select @Listcols = STUFF((SELECT ',' + QUOTENAME(t.Job) from Job t order by Job desc FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = N'SELECT Id, Username,' + @cols + N' from ( select D1.Id, D1.Username, COALESCE(CASE WHEN isnull(D2.UserId,0) > 0 THEN ''Yes'' Else ''No'' End, ''No'') as UserId, D3.Job from [User] D1 Inner Join User_Job D2 On D1.Id = D2.UserId Inner Join Job D3 On D2.JobId = D3.Id ) x pivot ( max(UserId) for Job in (' + @Listcols + N') ) p ' exec sp_executesql @query; 

Si les éléments du travail proviennent d'un résultat.

  CREATE TABLE #T1(id INT ,Username VARCHAR(100)) INSERT INTO #T1 SELECT 1,'jdoe' CREATE TABLE #T2(id INT ,Job VARCHAR(100)) INSERT INTO #T2 VALUES(1,'Waiter'),(2,'Office'),(3,'Freelance') CREATE TABLE #T3(id INT ,UserId INT ,JobId INT ) INSERT INTO #T3 VALUES(1,1,2),(2,1,3) DECLARE @col NVARCHAR(max),@sql NVARCHAR(max) SELECT @col=ISNULL(@col+',[','[')+Job+']' FROM #t2 PRINT @col SET @sql=' SELECT * FROM ( SELECT uj.Job,uj.Username,CASE WHEN t3.UserId IS NULL THEN ''No'' ELSE ''Yes'' END AS f FROM ( SELECT t2.id AS JobId, t2.Job,t1.id AS UserId, t1.Username FROM #T1 AS t1,#t2 AS t2 ) uj LEFT JOIN #T3 AS t3 ON t3.JobId = uj.JobId AND t3.UserId = uj.UserId ) AS t PIVOT(MAX(f) FOR job IN ('+@col+')) p' EXEC(@sql)