[SQL] GROUP BY ON CASE WHEN

sql问题
table:
date | category
2021-02-02 | null
2021-02-02 | 1
2021-02-02 | 2
2021-02-03 | null
2021-02-04 | 3
2021-02-04 | 3

如果想看每天,category有null和非null的总数

是不是直接通过在case when的基础上来group by (如下)得到的答案是错,是不是必须先创建case when的子查询才是唯一办法?
select date, (case when category is null then ‘null’ else ‘notnull’ end) as category, count(*)
from table
group by date, category

主要是我发现出来的结果虽然是有null和notnull,但每天的notnull有好多个,感觉是原来有几个distinct值就会也有几个notnull, 似乎query是最后才把原值转换成notnull的。所以想知道是否可以不借助构建子查询来实现目的呢

Yes, 你这里用case when的话,需要一个subquery,然后再groupby。

要了解你的query的问题,需要先理解sql执行顺序,group by是发生在select之前的,你的case when是发生group by得到的结果之后,所以结果是错的。

不使用subquery的话,那基于不同的sql engine可能有不同的语法糖帮你实现,但是如果不借助这些,使用general sql的话,那你就需要group by case when。