如何消除AdventureWorks库JobTitle列NULL值,实现单职位列统计男女数量
解决AdventureWorks中职位列无NULL且展示男女人数的问题
你的需求是得到一个无NULL值的职位列,同时在旁展示对应职位的男性、女性总人数。原代码的问题在于CASE语句仅处理了男性职位表为空的情况,当某个职位只有男性时,女性职位表的JobTitle为NULL,最终结果的JobTitle列仍会出现NULL值。
方案一:优化原临时表查询
通过COALESCE函数获取非NULL的职位名,同时用ISNULL将NULL的人数转为0,结果更直观:
USE AdventureWorks2019 GO select count(hre.gender) AS NumberOfFemales, JobTitle into #FemalesPerJobTitle from HumanResources.employee as hre group by JobTitle, Gender having gender = 'F'; SELECT COUNT(HRE.Gender) AS NumberOfMales, JobTitle INTO #MalesPerJobTitle FROM HumanResources.Employee AS HRE GROUP BY JobTitle, Gender HAVING gender = 'M'; SELECT ISNULL(FPJ.NumberOfFemales, 0) AS Females, ISNULL(MPJ.NumberOfMales, 0) AS Males, COALESCE(FPJ.JobTitle, MPJ.JobTitle) AS JobTitle FROM #FemalesPerJobTitle AS FPJ FULL OUTER JOIN #MalesPerJobTitle AS MPJ ON FPJ.JobTitle = MPJ.JobTitle
COALESCE(FPJ.JobTitle, MPJ.JobTitle):返回两个参数中第一个非NULL的值,确保JobTitle始终有有效内容。ISNULL(..., 0):将没有对应性别的人数显示为0,避免结果中出现NULL。
方案二:用条件聚合简化查询(推荐)
无需创建临时表,直接通过一次分组查询完成需求,效率更高:
USE AdventureWorks2019 GO SELECT JobTitle, COUNT(CASE WHEN Gender = 'F' THEN 1 END) AS Females, COUNT(CASE WHEN Gender = 'M' THEN 1 END) AS Males FROM HumanResources.Employee GROUP BY JobTitle
- 按
JobTitle分组后,用CASE筛选对应性别的记录并统计数量,自动处理单一性别的职位场景。 - 原表中
JobTitle无NULL值时,结果的JobTitle列自然不会出现NULL;若原表存在NULL职位,可添加WHERE JobTitle IS NOT NULL过滤。
内容的提问来源于stack exchange,提问作者sqlsister13
相关产品推荐
相关产品推荐

