Menu

如何将分组无结果的记录显示为0

如何在无结果集的情况下使得SUM()或者COUNT()的结果显示为0?

  在Sql中经常会使用SUM()或者COUNT()函数获取记录数量,同时,会使用GROUP BY进行分组统计。但在无结果集的情况下,分组是没有任何结果的。那么在无结果集的情况下,也能使得具体的分组的数量显示为0呢?比如像下面这样:

理想结果集

  通常我们会这样去写分组聚合的Sql:

SELECT
    ISNULL( SUM ( u_table1917.field5 ), 0 ) As val,
    u_table1916.companycode 
FROM
    u_table1917
    JOIN u_table1916 ON u_table1917.field3= u_table1916.field6 
WHERE
    u_table1916.field3 LIKE '2018%' 
    AND u_table1916.companycode IN ( 'GY00051', 'GY00071', 'GY00072', 'GY00073' ) 
GROUP BY
    u_table1916.companycode

  而在没有符合条件的记录时,结果通常为空:

空结果集

  自己也使用过ISNULL或者CASE ISNULL来做过处理,但依然得不到理想的结果。而此中原因,则与SQL Server的SELECT执行顺序有关,首先,在SELECT语句中,WHERE语句优先于GROUP BY,那么在进行分组时,数据已经被WHERE语句过滤掉了,分组处理时自然无法获取到那些数据。
  以下是SQL Server的SELECT语句的大致执行顺序(完整的解释可参考这里):
  1. FROM子句组装来自不同数据源的数据
  2. WHERE子句基于指定的条件删选数据
  3. GROUP BY子句将数据进行分组
  4. 使用聚合函数计算
  5. 使用HAVING子句筛选分组
  6. 计算所有表达式
  7. 使用ORDER BY对结果进行排序
  至此,我们可以将该结果集自己与自己关联,使用LEFT JOIN,左表是无条件结果集,右表是有条件的结果集,然后对关联得到的结果集使用ISNULL处理即可。这样就能使得GROUP BY能对所有的结果进行分组。代码如下:

SELECT DISTINCT Ma.companycode,ISNULL(Sub.val,0) FROM --此处使用ISNULL对结果进行判空处理 
(
SELECT
    u_table1916.companycode 
FROM
    u_table1917
    JOIN u_table1916 ON u_table1917.field3= u_table1916.field6
--此处使用LEFT JOIN 关联,因为左表是包括所有数据记录的,而右表只包括符合条件的,这样就能获得
--将所有的结果来进行分组,再加上ISNULL的处理,就可以显示聚合为0的记录
) AS Ma LEFT JOIN 
(
SELECT
    SUM ( u_table1917.field5 ) As val,
    u_table1916.companycode 
FROM
    u_table1917
    JOIN u_table1916 ON u_table1917.field3= u_table1916.field6 
WHERE
    u_table1916.field3 LIKE '2018%' 
GROUP BY
    u_table1916.companycode
) AS Sub ON Ma.companycode=Sub.companycode

  而结果也就是文章开头给出的图示那样符合要求。

Posted In:
数据库

暂无评论

添加评论 您的邮箱将会被妥善保存