2017-08-02 101 views
0

我試圖根據用戶遇到了一些表所做的工作凡而不丟失數據

任務

TaskID  TaskTitle 
---------------------- 
1   Job 1 
2   Job 2 
3   Job 3 

工作表

顯示一些與數據透視表日期之間的條款
JobID  AssignedTo 
---------------------------- 
1   guid1 
2   guid2 
3   guid3 

用戶表

UsersGuid UserName 
------------------ 
guid1  Username1 
guid2  Username2 
guid3  Username3 

而我想顯示是類似於以下

Task UserName1  UserName2  UserName3 
Task1 0    0    0 
Task2 0    97   4 
Task3 0    6    0 
Task4 2    40   55 

我有下面的代碼,但我有被我希望它仍然顯示任務名稱,即使從來沒有出現過問題任何工作,但如果沒有發現值,它不會顯示它。

create table #TempTable 
     (
      JobID int, 
      TaskID int, 
      TaskTitle varchar(max), 
      UserName varchar(max) 
     ) 

INSERT INTO #TempTable 

    select 
    Job.JobID, 
    Job.TaskID, 
    tasks.TaskTitle, 
    users.UserName as AssignedName 

    from TaskLookups tasks 

    left join Jobs job on 
    tasks.TaskID = job.TaskID 

    left join Users users on 
    job.TaskAssignedTo = users.UserID 

    WHERE 
    (job.JobDateTime BETWEEN CONVERT(DATETIME, '2016-12-01 00:00:00', 102) AND CONVERT(DATETIME, '2017-07-01 23:59:00', 102)) 

declare @query as nvarchar(max), 
@cols as nvarchar(max) 

    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(UserName) 
        from StaffUsers 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 
    ' 
    Select * From #TempTable 
    pivot (count(JobID) For UserName in(' + @cols + ')) as Result order by TaskTitle 
    ' 
exec sp_executesql @query 
DROP TABLE #TempTable 

非常感謝

回答

1

的問題是,雖然你離開加盟Jobs,你那麼WHERE子句中使用job.JobDateTime

WHERE 
(job.JobDateTime BETWEEN CONVERT(DATETIME, '2016-12-01 00:00:00', 102) 
      AND CONVERT(DATETIME, '2017-07-01 23:59:00', 102)) 

沒有定日期時間工作的任何任務將有NULL一個值job.JobDateTime,和NULL不在2016年12月1日和2017年7月1日之間,因此整行被刪除,從而刪除任務。有效地讓你的左邊加入一個內部連接。

你應該謂詞移動到連接條件:

LEFT JOIN Jobs job 
    ON tasks.TaskID = job.TaskID 
    AND job.JobDateTime >= CONVERT(DATETIME, '2016-12-01', 102) 
    AND job.JobDateTime < CONVERT(DATETIME, '2017-07-02', 102) 

N.B我已經改變BETWEEN一個開放式的範圍,本條規定的原因:What do BETWEEN and the devil have in common?

+0

這很棒,做了詭計,謝謝!沒想到我可能已經遠離了! – slowlygettingthere

0

添加UNION ALL並選擇未分配的任務列表(WHERE的JobId是NULL),並把用戶名作爲0他們。