SQL分组统计把不存在的组计数为0

如果该指示符为0,则添加0以保证数据的连续性。

详细信息表具有指标名称,我们使用 sum + null 将其转换为 0。

明细表中没有指标名称,添加所有指标名称使用Union + 0。

使用casewhen自己写条件,没有数据则返回0。

我直接使用MySQL。
您可能需要添加另一个数据库。

自己掂量一下。

sql中groupby的用法 掌握分组查询的核心技巧

GROUPBY 用于分组和合并,通常与 SUM 等聚合函数一起使用,以简化数据分析。

基本用法:可以轻松创建按类别的销售统计。

多列分组:将类别和区域分组在一起以获得更高的精度。

HAVING是过滤,WHERE先过滤,然后HAVING过滤分组结果。

SELECT 列必须是 GROUPBY。
如果不是,那你就错了。

更好的性能:使用更少的列,使用索引,先使用 WHERE,然后使用 GROUPBY。

易于阅读:用别名替换长函数以保持简单。

适用于销售、用户、科研、财务。

GROUPBY 让您的数据变得有用。

sql中group by怎么使用 GROUP BY分组统计的3个关键知识点

说实话,GROUP BY如果使用得当的话可以省去很多麻烦,但是也有很多地方很容易出问题。
让我向您介绍我多年来收集的三个要点。
都是真实的陷阱或者特别实用的点。

---
1 主要任务:不要只知道分组的表面技巧
刚开始学习GROUP BY的时候,我以为就是根据某个字段将数据分成堆,然后找到求和函数(SUM、COUNT等)然后扔掉。
有一次,汇报的时候,老板想按部门统计销售额,结果发现数据不对——有的部门有销售额,但在集团里看不到。
后来才知道这个产品默认过滤空值而不汇总。

举个我遇到的一个坑的例子:比如命令表中有一个“用户ID”,有些命令没有填写。
SQL 本身将 NULL 视为臃肿。
结果在统计每个用户的订单数时,所有的NULL订单都被分成了一个单独的组,看起来特别奇怪。
后来通过使用 WHERE user_id IS NOT NULL 解决了。
所以说清楚一点,GROUP BY不仅仅是分组,还包括如何处理空值,否则数据可能会生你的气。
2 . 语法规则:未连接列的隐藏要求
这是我看到很多新手陷入困境的地方。
例如,如果要编写SQL来计算每个用户的总订单大小,则可以将其写为
sql。
user_id, SUM(金额); 从订单 按大小分组;
乍一看是错误的,但大多数人第一次写的时候并没有意识到。
为什么?因为user_id是写在SELECT中的,所以这个对象不是聚合函数的结果,后面必须跟GROUP BY。
SQL引擎无法识别这个“隐藏”函数,错误是不可避免的。
当时我盯着错误报告,但后来老师一巴掌打在我的大腿上:“试想一下,分组是根据体型大小,但体型不计入分数,这不是矛盾吗?”需要明确的是,GROUP BY 中的分组基础必须与 SELECT 中显示的未分组列相匹配。
例如,如果要显示user_id,则GROUP BY后面必须有user_id。
3 、Having子句:组后二次过滤
最有经验的WHERE和HAVING混合使用即使是开发人员也遇到过这样的问题。
例如,如果您想过滤掉订单总额大于 1 ,000 的用户,您会输入什么?规模 SELECT user_id, SUM(金额) AS 总金额 从订单 按 user_id 分组 总和(大小)> 1 000 按总大小 DESC 排序;
注意WHERE和HAVING子句:WHERE在分组前对原始数据进行过滤,例如WHERE user_id != 0;当HVING分组后过滤掉不符合条件的组时。
大多数人无法区分。
你想用WHERE直接写SUM(amount) > 1 000,但是SQL直接返回结果:“WHERE不能直接用于求和函数!”
我当时也犯过这个错误。
写完才发现WHERE后面不能直接跟SUM,数据很乱。
查资料发现sum函数是分组后计算的,WHERE是分组前确定的。
无法事先知道 SUM 后的结果。

---
高级用法的补充要点,都是我总结的:

值设置:GROUP BY默认以NULL为一组。
如果您不希望它本身成为一个单独的组,则必须使用 WHERE 将其排除。
比如枚举用户命令时,首先WHERE user_id is NOT NULL,这样NULL用户自然就被过滤掉了。

多列分组:比如想查看每个用户在不同产品上花费了多少钱,只需要GROUP BY user_id,product_id即可。
我以前在项目中用过这个,但是当按product_id分组时,查询特别慢,因为product id是字符串类型。
后来改成整数类型,性能直接翻倍。
因此,在选择对列进行分组时优先选择整数绝对是正确的。


性能优化:这非常重要。
我看到一个报告运行了3 个小时,但是GROUP BY列没有被指示。
指标建成后,飞得很快。
记住,GROUP BY是SQL顺序中的关键点,建立索引是一种非常划算的优化方法。

---
说实话,如果你经常使用 GROUP BY,会感觉就像呼吸一样轻松,但是一开始有一些陷阱需要注意。
特别是WHERE/HVING和强规则的区别是非合并列必须出现在GROUP BY中,多练习。