我的名单中有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名没有员工的主管刚刚离开。我无法找到更好的方法来改进它。
有人可以帮忙吗?
答案 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