【问题标题】:Sql remove Null Values in sub queriesSql 删除子查询中的空值
【发布时间】:2021-04-19 12:59:51
【问题描述】:

我正在尝试进行子选择查询,但我的组中有 Null 值

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 |

【问题讨论】:

  • 单独按 ArretProductionJournee.EnumArret 分组。
  • 你可以尝试使用 COALESCE
  • @jarlh 我试过了,但 ArretProductionJournee.DateArret 需要在 groupBy 中才能进行聚合

标签: sql sql-server null subquery sql-subselect


【解决方案1】:

我猜你不需要那些子选择。请改用条件聚合。试试这个。

SELECT CONVERT(varchar, DateArret, 3), 
       SUM(IIF(EnumArret Like 'HH', datediff(minute, HeureDebut, HeureFin, 0)) AS HH,
       SUM(IIF(EnumArret Like 'HI', datediff(minute, HeureDebut, HeureFin, 0)) AS HI,
       SUM(IIF(EnumArret Like 'PS', datediff(minute, HeureDebut, HeureFin, 0)) AS PS,
  FROM dbo.ArretProductionJournee 
 WHERE DateArret BETWEEN '01/04/2021'and '03/04/2021'
 GROUP BY CONVERT(varchar, DateArret, 3)

之所以称为条件聚合,是因为每个SUM(IIF(condition, val, 0)) 项仅将匹配条件的行相加。

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

【讨论】:

    【解决方案2】:

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

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2014-10-07
      相关资源
      最近更新 更多