除了一件事之外,下面的查询效果很好。
我在最终用户报告中使用“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]
有办法做到这一点吗?
最佳答案
使用左连接
并将where
子句移至on
子句。这将返回 in()
列表中的所有 p.[Workstream]
和那些 t.Task_Significance
。
您可以使用coalesce()
或isnull()
当没有匹配的 t.Task_Significance
时,用一个值替换 null
。
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]
关于SQL 返回值为零,因此过滤器保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43808007/