2016-12-19 26 views
3

這是我的表:SQL:顯示錶和肯定它的工作,沒有

用戶表

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

工作表

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

用戶工作表

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

如何選擇該表並顯示它看起來像下面這樣:

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

回答

2

這是一個非常標準的支點查詢的問題,另外還有輕微的扭曲。如果給定用戶沒有分配某種類型的作業,則要顯示'No'。一種方法是使用COALESCE並替換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 
+0

我試過你的代碼bro,但它給了我一個錯誤「不正確的語法附近」)'「。 –

+0

@saibharath對不起,我有一個小錯字,'CASE'語句中缺少'END',請重試。 –

+0

現在它顯示「Column'User.UserName'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。」 –

1

試試這個..

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 
+0

工作完美謝謝... –

0
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; 
0

如果作業項目來自一個結果。

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 ('[email protected]+')) p' 
    EXEC(@sql)