除了一件事之外,下面的查询效果很好。 我在我的最终用户报告中使用该列作为“WorkStream”作为过滤器。由于它是一个过滤器,无论查询是否返回任何内容,我都需要它 当然,我必须使用where子句作为查询中的过滤器,以便只返回某些任务。 麻烦的是,当我有一个没有任何task_Significance项目的工作流时,工作流将被删除,报告过滤器(工作流)不起作用。
我需要的是一个看起来像这样的表,但如果我有一个缺少的工作流,那么它会一直放“0”。但是,只有当工作流丢失时,它才会返回过滤器名称(因此报告将具有过滤器,并且只显示最终报告中过滤器下方的空表。
这是我的代码:
SELECT
p.[Workstream]
,T.[Task_Significance]
,COUNT(1) AS Total
,SUM(case when T.[TaskPercentCompleted] >= 100 then 1 else 0 end) AS Actual
,SUM(case when T.[TaskFinishDate] <= DATEADD(DAY, 8-DATEPART(DW, GETDATE()), Convert(date,getdate())) then 1 else 0 end) AS Planned
FROM [psmado].[dbo].[MSP_EpmProject_UserView] as P
join [PSMADO].[dbo].[MSP_EpmTask_UserView] as T
On T.[projectUID] = P.[projectUID]
WHERE
[Task_Significance] IN('Application', 'Data', 'Interface', 'End User Compute', 'Network', 'Compute Package', 'Data Center', 'CREWS Sites', 'App Design Review', 'Infra Design Review')
GROUP BY p.[EnterpriseProjectTypeUID], p.[Workstream],T.[Task_Significance]
有没有这样做?
答案 0 :(得分:2)
使用left join
并将where
子句移至on
子句。这将返回p.[Workstream]
列表中的所有t.Task_Significance
和in()
。
如果没有匹配的null
,您可以使用coalesce()
或isnull()
替换t.Task_Significance
的值。
select
p.[Workstream]
, coalesce(T.[Task_Significance], 'none') as Task_Significance
, count(1) as Total
, sum(case when T.[TaskPercentCompleted] >= 100 then 1 else 0 end) as Actual
, sum(case when T.[TaskFinishDate]
<= dateadd(day, 8 - datepart(dw, getdate()), Convert(date, getdate()))
then 1 else 0 end) as Planned
from [psmado].[dbo].[msp_EpmProject_UserView] as P
left join [psmado].[dbo].[msp_EpmTask_UserView] as T
on T.[projectuid] = P.[projectuid]
and [Task_Significance] in ('Application', 'Data', 'Interface'
, 'End User Compute', 'Network', 'Compute Package', 'Data Center'
, 'crews Sites', 'App Design Review', 'Infra Design Review')
group by
p.[EnterpriseProjectTypeuid]
, p.[Workstream]
, T.[Task_Significance]