我正在研究SQL Server中一个令人难以置信的问题。我想要完成的是,我有一个表temp2(下图),其中包含来自许多内连接的数据,然后用于SSRS报告。
我想解决的问题是,即使他们没有在提供的日期中输入任何值,我怎样才能为每位员工填写缺失的标题?
问题是,是否可以为每个ProjectName
填写Employee
的遗失标题?如SSRS报告中所示,每个员工都应该从正在读取表temp2的数据集中返回所有ProjectName
...
修改
所以这就是我尝试过的,即使我把所有的项目名都放到了我的temp2中,这也是丑陋而低效的。由于不需要的数据,ssrs运行时间太长。
Select distinct Employee = Coalesce(a.Employee, @SelectEmployee), EmpId = Coalesce(a.EmpId, (Select PkId from AllRef Where Ness='All')), c.Day, Title=Coalesce((case when a.Title like '%-%'
then left(a.Title, charindex('-', a.Title))
else a.Title
end),''), p.ProjectName, Description =coalesce(a.Description,''), Val = Coalesce(a.Val,''), AbbrevJob = COALESCE(a.abbrevjob, ''),
week1Total=(select sum(val) as week1 from temp1 WHERE day >= Dateadd("d", -14, @WeekEnding) AND day <= Dateadd("d", -7, @WeekEnding)),
week2Total=(select sum(val) as week2 from temp1 WHERE day >= Dateadd("d", -7, @WeekEnding) AND day <= @WeekEnding )
from dbo.Calender as c
left outer join temp2 as a
on c.Day = a.Day
cross join ProjectName p
--on p.PkId = a.Abbrevjob-2
Where c.Day >= Dateadd("d",-13,@WeekEnding) and c.Day <= @WeekEnding
order by EmpId asc
Cross Join确实完成了任务,但重复是杀死性能。谁知道如何处理?
答案 0 :(得分:2)
通常的方法是构建所有员工和所有项目的矩阵,然后选择查询小时数。例如:
; with Employees as
(
select distinct EmployeeName
from TableWithEmployees
)
, Projects as
(
select distinct ProjectName
from TableWithProjects
)
select *
from Employees e
cross join
Projects p
left join
TableWithDetails d
on d.EmployeeName = e.EmployeeName
and d.ProjectName = p.ProjectName
left join
表示不会过滤掉没有详细信息的行。
答案 1 :(得分:0)
虽然我以前从未这样做过,但是我想到的解决方案非常简单......
该报告的问题在于您尝试使用项目名称表内连接数据。它实际上并不是问题,它是每个人在需要此类报告时使用的正确方法。
但是当谈到你说的问题时,那就是问题......
获取项目名称的完整列表是外部加入项目名称表。但在这种情况下,您仍然只能获得每个员工的项目,如果有任何项目名称没有填写员工记录,它仍会显示在列表中,但只会出现一次而不会分配给任何员工。而那不是你所需要的。
因此解决方案首先是外部联接员工和项目名称,然后内部加入数据表。
您可以从数据表中选择DISTINCT empId值,并在ProjectNames上选择FULL OUTER JOIN。然后LEFT OUTER JOIN结果到数据表,这次是empId = empId和PkId = AbbrevJob(如果我对了保存项目名称id-s的列)。
应该有用,请告诉我,不管它是否有,祝你好运!