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中才能进行拒绝