仅使用来自另一个表的数据填充sql中的表(如果该表尚不存在)

时间:2015-10-01 20:33:00

标签: sql-server reporting-services

我正在研究SQL Server中一个令人难以置信的问题。我想要完成的是,我有一个表temp2(下图),其中包含来自许多内连接的数据,然后用于SSRS报告。

我想解决的问题是,即使他们没有在提供的日期中输入任何值,我怎样才能为每位员工填写缺失的标题?

问题是,是否可以为每个ProjectName填写Employee的遗失标题?如SSRS报告中所示,每个员工都应该从正在读取表temp2的数据集中返回所有ProjectName ...

Temp2 ProjectName ssrs reporting

修改

所以这就是我尝试过的,即使我把所有的项目名都放到了我的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确实完成了任务,但重复是杀死性能。谁知道如何处理?

2 个答案:

答案 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的列)。

应该有用,请告诉我,不管它是否有,祝你好运!