凡而不丢失数据

问题描述:

我试图根据用户遇到了一些表所做的工作凡而不丢失数据

任务

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 

非常感谢

的问题是,虽然你离开加盟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

添加UNION ALL并选择未分配的任务列表(WHERE的JobId是NULL),并把用户名作为0他们。