返回

如何轻松统计各小时列中大于0的数据个数?

mysql

如何汇总各小时列中大于 0 的数据个数

问题

在数据分析中,我们经常需要统计满足特定条件的数据量。例如,我们可能需要知道每小时内大于特定阈值的数据个数。本篇文章将探讨如何使用 SQL 来解决这个问题,并重点介绍汇总各小时列中大于 0 的数据个数。

解决方案

要统计各小时列中大于 0 的数据个数,我们可以使用 SQL 中的 COUNT() 函数和 IF() 函数。

COUNT() 函数 用于计算满足特定条件的行数。IF() 函数 用于检查一个条件是否为真,并返回相应的值。

具体来说,我们可以使用以下步骤来解决问题:

  1. 创建列别名: 为每个小时列创建别名,以便在 COUNT() 函数中引用它们。例如,将 HOUR(tgl) 列别名为 '6am'
  2. 使用 IF() 函数:COUNT() 函数中使用 IF() 函数检查每个小时列的值是否大于 0。如果大于 0,则返回 1;否则,返回 NULL。例如,COUNT(IF(HOUR(tgl)=6,1,NULL)) 将统计 HOUR(tgl) 列中等于 6(即上午 6 点)且值大于 0 的行数。
  3. 汇总结果: 使用 GROUP BY 子句根据需要汇总的数据进行分组。例如,如果要按日期和材料对数据进行分组,则可以将 dtmaterial 列包括在 GROUP BY 子句中。
  4. 计算总数: 使用 COUNT() 函数计算各组的总行数。例如,COUNT(dt) 将统计每组中的行数。
  5. 汇总各列: 使用 SUM() 函数汇总各小时列中的值。例如,SUM(kubik) 将汇总每组中的 kubik 列的值。

示例查询

以下示例查询演示了如何统计 ritase 表中每小时大于 0 的数据个数并将其汇总到总行:

SELECT 
    unit,
    dt,
    pengguna,
    loader,
    material,
    kubik,
    COUNT(IF(HOUR(tgl)=6,1,NULL)) AS '6am',
    COUNT(IF(HOUR(tgl)=7,1,NULL)) AS '7am',
    COUNT(IF(HOUR(tgl)=8,1,NULL)) AS '8am',
    COUNT(IF(HOUR(tgl)=9,1,NULL)) AS '9am',
    COUNT(IF(HOUR(tgl)=10,1,NULL)) AS '10am',
    COUNT(IF(HOUR(tgl)=11,1,NULL)) AS '11am',
    COUNT(IF(HOUR(tgl)=12,1,NULL)) AS '12pm',
    COUNT(IF(HOUR(tgl)=13,1,NULL)) AS '1pm',
    COUNT(IF(HOUR(tgl)=14,1,NULL)) AS '2pm',
    COUNT(IF(HOUR(tgl)=15,1,NULL)) AS '3pm',
    COUNT(IF(HOUR(tgl)=16,1,NULL)) AS '4pm',
    COUNT(IF(HOUR(tgl)=17,1,NULL)) AS '5pm',
    COUNT(dt) AS truckcount,
    SUM(kubik) AS totkubik,
    SUM(distance) AS totjarak 
FROM 
    ritase 
WHERE 
    unit LIKE 'EX 815' 
    AND tgl BETWEEN CONCAT(CURDATE(), ' 06:00:00') 
    AND CONCAT(CURDATE(), ' 17:59:59') 
    AND material IN ('SOIL','CLAY','MUD','LIQUID MUD','SAND','BLEND','PARTING') 
GROUP BY dt, material 
ORDER BY pengguna ASC;

此查询将统计 ritase 表中 unitEX 815tgl 在当前日期 06:00:00 至 17:59:59 之间且 material 为指定值的每小时大于 0 的数据个数。它还将汇总各组的总行数、kubik 列的值和 distance 列的值。

总结

通过使用 COUNT() 函数和 IF() 函数,我们可以轻松地在 SQL 中统计各小时列中大于 0 的数据个数并将其汇总到总行。这对于分析特定条件下的数据量非常有用。

常见问题解答

  1. 为什么要使用 IF() 函数?

    • IF() 函数允许我们在 COUNT() 函数中检查一个条件是否为真,并返回相应的值。这使我们能够统计满足特定条件的行数。
  2. 如何创建列别名?

    • 使用 AS 将别名分配给列。例如,HOUR(tgl) AS '6am'HOUR(tgl) 列别名为 '6am'
  3. 如何汇总各小时列的值?

    • 使用 SUM() 函数可以汇总各小时列中的值。例如,SUM(kubik) 将汇总每组中的 kubik 列的值。
  4. 如何按多列进行分组?

    • GROUP BY 子句中列出要分组的列。例如,GROUP BY dt, material 将按 dtmaterial 列对数据进行分组。
  5. 如何按特定顺序对结果进行排序?

    • ORDER BY 子句中指定要排序的列及其排序顺序(升序或降序)。例如,ORDER BY pengguna ASC 将按 pengguna 列升序对结果进行排序。