sql 分组统计,数据为空时显示0

本文介绍了一种使用SQL进行数据查询的方法,通过示例展示了如何在指定的时间范围内对不同状态的数据进行汇总统计,并提供了两种实现方式以应对不同场景的需求。

1.未添加时间搜索条件,查询结果如下

2. 添加时间添加后,未有符合条件的数据,呈现的结果如下:



实际想要的结果 应该是如下情况:


直接上代码:

SELECT
name,
SUM (Total) AS total,
SUM (Untreated) AS untreated,
SUM (Dealing) AS dealing,
SUM (Handled) AS handled
FROM
(
SELECT oe.Name AS name, COUNT (aj.SjZt) AS Total, 
SUM ( CASE aj.SjZt WHEN '0' THEN 1 ELSE 0 END ) AS Untreated,
SUM ( CASE aj.SjZt WHEN '1' THEN 1 ELSE 0 END ) AS Dealing,
SUM ( CASE aj.SjZt WHEN '2' THEN 1 ELSE 0 END ) AS Handled
FROM Organize oe
LEFT JOIN AJ_Ajxx aj ON aj.UserDept = oe.id
WHERE (oe.wid = '1' OR oe.PID = '1')
AND aj.AddTime BETWEEN '2019/5/1 0:00:00'
AND '2019/5/31 23:59:59'
GROUP BY
oe.Name
UNION
SELECT '11' AS name, '0' AS Total, '0' AS Untreated, '0' AS Dealing, '0' AS Handled
UNION
SELECT '22' AS name, '0' AS Total, '0' AS Untreated, '0' AS Dealing, '0' AS Handled
UNION
SELECT '33' AS name, '0' AS Total, '0' AS Untreated, '0' AS Dealing, '0' AS Handled
) c
GROUP BY

c.name

注意:


红框部分如果不是固定,那可以先将展示的的先查询出来,然后将循环拼接上语句:

写法二:

if exists (SELECT
aj.UserDept,
oe.Name,
COUNT (aj.SjZt) AS Total,
SUM ( CASE aj.SjZt WHEN '0' THEN 1 ELSE 0 END ) AS Untreated,
SUM ( CASE aj.SjZt WHEN '1' THEN 1 ELSE 0 END ) AS Dealing,
SUM ( CASE aj.SjZt WHEN '2' THEN 1 ELSE 0 END ) AS Handled
FROM
Organize oe
LEFT JOIN AJ_Ajxx aj ON aj.UserDept = oe.id
WHERE
(oe.wid = '1' OR oe.PID = '1')
 and (aj.AddTime >'2018/5/1 00:00:00' and aj.AddTime <'2018/5/31 23:59:59' and aj.AddTime between '2018/5/1 00:00:00' and '2018/5/31 23:59:59')
GROUP BY
aj.UserDept,
oe.Name
)
begin
    SELECT
aj.UserDept,
oe.Name,
COUNT (aj.SjZt) AS Total,
SUM ( CASE aj.SjZt WHEN '0' THEN 1 ELSE 0 END ) AS Untreated,
SUM ( CASE aj.SjZt WHEN '1' THEN 1 ELSE 0 END ) AS Dealing,
SUM ( CASE aj.SjZt WHEN '2' THEN 1 ELSE 0 END ) AS Handled
FROM
Organize oe
LEFT JOIN AJ_Ajxx aj ON aj.UserDept = oe.id
WHERE
(oe.wid = '1' OR oe.PID = '1')
 and (aj.AddTime >'2018/5/1 00:00:00' and aj.AddTime <'2018/5/31 23:59:59' and aj.AddTime between '2018/5/1 00:00:00' and '2018/5/31 23:59:59')
GROUP BY
aj.UserDept,
oe.Name 
end
else
begin
SELECT
aj.UserDept,
oe.Name,
Total=0,Untreated=0,Dealing=0,Handled=0
FROM
Organize oe
LEFT JOIN AJ_Ajxx aj ON aj.UserDept = oe.id
WHERE
(oe.wid = '1' OR oe.PID = '1')
 
GROUP BY
aj.UserDept,
oe.Name 
   
end


### SQL 分组统计常用聚合函数 #### COUNT 函数 `COUNT` 用来计算指定列中非 `NULL` 值的数量或者表中的总行数。当参数为(`*`),它会统计所有的记录,包括含有 `NULL` 的字段;而如果指定了某一列,则只会统计该列为 `NULL` 的记录[^4]。 ```sql SELECT COUNT(*) AS total_records, COUNT(column_name) AS non_null_values FROM table_name; ``` #### SUM 函数 `SUM` 返回数值型表达式的总和。此函数适用于整数、货币以及浮点数类型的列,并自动忽略任何 `NULL` 值[^1]。 ```sql SELECT SUM(column_name) AS sum_of_column FROM table_name; ``` #### AVG 函数 `AVG` 计算给定列的平均值,同样只考虑非 `NULL` 数据项并返回结果作为浮点数或十进制数取决于输入的数据类型。 ```sql SELECT AVG(DISTINCT column_name) AS average_value -- DISTINCT 可选 FROM table_name; ``` #### MAX 和 MIN 函数 这两个函数分别找出某列的最大值 (`MAX`) 和最小值 (`MIN`) ,它们也会跳过 `NULL` 来寻找有效范围内的极值。 ```sql SELECT MAX(column_name) AS maximum_value, MIN(column_name) AS minimum_value FROM table_name; ``` 为了实现更复杂的查询需求,这些聚合函数经常配合 `GROUP BY` 子句一起使用来完成按特定条件分组后的统计数据汇总工作。例如,在多个部门的情况下获取各部门员工工资总额及人数: ```sql SELECT department_id, SUM(salary) as salary_total, COUNT(employee_id) as employee_count FROM employees GROUP BY department_id; ``` 此外还可以加上 `HAVING` 进一步筛选满足一定条件的结果集,比如仅显示那些平均薪资低于某个阈值的部门信息[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值