Sql删除子查询中的空值

Sql删除子查询中的空值,sql,sql-server,null,subquery,sql-subselect,Sql,Sql Server,Null,Subquery,Sql Subselect,我正在尝试执行子选择查询,但我的分组中有空值 SELECT convert(varchar, dbo.ArretProductionJournee.DateArret, 3) , (select sum (datediff(minute, ArretProductionJournee.HeureDebut, ArretProductionJournee.HeureFin) ) where ArretProductionJournee.EnumArret Like 'HH')

我正在尝试执行子选择查询,但我的分组中有空值

SELECT        convert(varchar, dbo.ArretProductionJournee.DateArret, 3) , 
(select
sum (datediff(minute, ArretProductionJournee.HeureDebut, ArretProductionJournee.HeureFin)  ) 
where ArretProductionJournee.EnumArret Like 'HH')
as HH, 
(select
sum (datediff(minute, ArretProductionJournee.HeureDebut, ArretProductionJournee.HeureFin)  ) 
where ArretProductionJournee.EnumArret Like 'HI')
as HI,
(select
sum (datediff(minute, ArretProductionJournee.HeureDebut, ArretProductionJournee.HeureFin)  ) 
where ArretProductionJournee.EnumArret Like 'PS')
as PS
FROM            
dbo.ArretProductionJournee 
where dbo.ArretProductionJournee.DateArret BETWEEN '01/04/2021'and '03/04/2021'
group by ArretProductionJournee.EnumArret, convert(varchar, dbo.ArretProductionJournee.DateArret, 3)
结果如下:

我想删除这些空值以获得如下结果:

---------------------------
Date Arrêt | HH | HI | PS |
---------------------------
03 / 02/ 21| 0  | 29 | 45 |

我很确定您只需要条件聚合:

select convert(date, dbo.ArretProductionJournee.DateArret), 
       sum(case when apj.EnumArret = 'HH'
                then datediff(minute, apj.HeureDebut, apj.HeureFin)  
           end) as HH, 
       sum(case when apj.EnumArret = 'HI'
                then datediff(minute, apj.HeureDebut, apj.HeureFin)  
           end) as HI, 
       sum(case when apj.EnumArret = 'PS'
                then datediff(minute, apj.HeureDebut, apj.HeureFin)  
           end) as PS
from  dbo.ArretProductionJournee apj
where apj.DateArret between '2021-04-01' and '2021-04-03'
group by convert(date, apj.DateArret);

我很确定您只需要条件聚合:

select convert(date, dbo.ArretProductionJournee.DateArret), 
       sum(case when apj.EnumArret = 'HH'
                then datediff(minute, apj.HeureDebut, apj.HeureFin)  
           end) as HH, 
       sum(case when apj.EnumArret = 'HI'
                then datediff(minute, apj.HeureDebut, apj.HeureFin)  
           end) as HI, 
       sum(case when apj.EnumArret = 'PS'
                then datediff(minute, apj.HeureDebut, apj.HeureFin)  
           end) as PS
from  dbo.ArretProductionJournee apj
where apj.DateArret between '2021-04-01' and '2021-04-03'
group by convert(date, apj.DateArret);

我想您不需要这些子选择。改为使用条件聚合。试试这个

选择CONVERT(varchar,DateArret,3),
求和(IIF(类似于'HH'的枚举数,datediff(分钟,heuredbut,HeureFin,0))为HH,
总和(IIF(类似“HI”的枚举数,datediff(分钟,HeuredBut,HeureFin,0))为HI,
总和(IIF(类似于'PS'的枚举数,datediff(分钟,HeuredBut,HeureFin,0))作为PS,
来自dbo.ArretProductionJournee
其中日期介于“2021年4月1日”和“2021年4月3日”之间
按转换分组(varchar、DateArret、3)
它被称为条件聚合,因为每个
SUM(IIF(condition,val,0))
项只添加与条件匹配的行


我从您的列名中删除了表名(
ArretProductionJournee.heuredbuts
变成了
heuredbuts
),因为您只使用一个表,而且查询更易于读取。

我想您不需要这些子选择。请改用条件聚合。试试这个

选择CONVERT(varchar,DateArret,3),
求和(IIF(类似于'HH'的枚举数,datediff(分钟,heuredbut,HeureFin,0))为HH,
总和(IIF(类似“HI”的枚举数,datediff(分钟,HeuredBut,HeureFin,0))为HI,
总和(IIF(类似于'PS'的枚举数,datediff(分钟,HeuredBut,HeureFin,0))作为PS,
来自dbo.ArretProductionJournee
其中日期介于“2021年4月1日”和“2021年4月3日”之间
按转换分组(varchar、DateArret、3)
它被称为条件聚合,因为每个
SUM(IIF(condition,val,0))
项只添加与条件匹配的行


我从列名中删除了表名(
ArretProductionJournee.heuredbut
变为
heuredbut
)因为您只使用一个表,而且查询更易于读取。

GROUP BY ARRETPRODUCTIONJOUREE.EnumArret单独使用。您可以尝试使用COALESCE@jarlh我尝试过,但是ArretProductionJournee.DateArret需要单独在agregationGROUP的groupBy ArretProductionJournee.EnumArret中。您可以尝试使用COALESCE@jarlh我试过了,但是ArretProductionJournee.DateArret需要在groupBy中才能进行拒绝