如何在条件选择中将null替换为0

时间:2019-08-09 14:26:29

标签: google-bigquery

我的名单中有100名主管,我想计算一下在01/01/2018年初有多少名员工受到他们的监督。

这些是我尝试的代码。但是,由于主管没有员工,他们的名字只会在表中消失。我只想保留他们的名字,如果没有员工,将其人数设置为0。

select
    Supervisor,
    IFNULL(COUNT(EmpID),0) AS start_headcount
from 
    `T1`
where
     (Last_hire_date < date'2018-01-01'
     AND
    term_date >=  date'2018-01-01' )OR 
    ( Last_hire_date < date'2018-01-01'
     AND
    term_date is null)
group by
    1
order by
    1 asc

结果发现,列表中只有92位主管在其下有雇员。其他8名没有员工的主管刚刚离开。我无法找到更好的方法来改进它。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

以下是用于BigQuery标准SQL

#standardSQL
SELECT
  Supervisor,
  COUNTIF(
    (Last_hire_date < DATE '2018-01-01' AND term_date >=  DATE '2018-01-01' ) 
    OR 
    (Last_hire_date < DATE'2018-01-01' AND term_date IS NULL)
  ) AS start_headcount
FROM 
  `T1`
GROUP BY
  1
ORDER BY
  1 ASC   

有问题的原始查询中的问题是因为过滤发生在WHERE子句级别,因此实际上完全排除了不匹配的行,结果未显示某些主管

因此,我改为将条件移至COUNTIF()-替换了IFNULL(COUNT())内容

如果您存储的数据需要考虑DISTINCT的情况-以下将解决这种情况

  

在这里,您没有将不同的员工ID计为人数

#standardSQL
SELECT
  Supervisor,
  COUNT(DISTINCT 
    IF(
      (Last_hire_date < DATE '2018-01-01' AND term_date >=  DATE '2018-01-01' ) 
      OR 
      (Last_hire_date < DATE'2018-01-01' AND term_date IS NULL),
      EmpID,
      NULL
    )
  ) AS start_headcount  
FROM 
  `T1`
GROUP BY
  1
ORDER BY
  1 ASC