SQL 返回值为零,因此过滤器保留

标签 sql sql-server

除了一件事之外,下面的查询效果很好。 我在最终用户报告中使用“WorkStream”列作为过滤器。因为它是一个过滤器,所以无论查询是否返回任何内容,我都需要它存在。
当然,我必须在查询中使用 where 子句作为过滤器,以便只返回某些任务。 问题是,当我的工作流没有任何 task_Significance 项目时,工作流将被删除,并且报告过滤器(工作流)不起作用。

我需要的是一个看起来像这样的表格,但如果我缺少工作流,那么它会一直显示“0”。但只有当工作流丢失时,它才会仅返回过滤器名称(因此报告将具有过滤器,并且仅在最终报告中的过滤器下方显示和清空表格。

enter image description here

这是我的代码:

        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/

相关文章:

sql - 将.bak文件还原到远程数据库

sql - 我需要在 asp classic 中针对 sql 注入(inject)进行参数化,在开始进行更改之前我应该​​花一些时间了解哪些内容?

sql - 右外连接没有得到相同的结果不知道为什么 (=*)

asp.net - 在 ASP.NET 中使用 SQL 代替 RESX 文件进行本地化

C# 添加一个数组到 SQL CE 数据库

sql-server - Insert Update触发器如何判断是插入还是更新

mysql - Visual Basic 需要从 MySQL 更改为 MSSQL

sql - 通过通配符扩展将星号符号编辑到 SSMS 中的列名列表中

sql - 如何对一个模型*不*包含另一个模型的多对多关系进行过滤?

mysql - 通过对自身执行查询来更新表