【问题标题】:Calculate AVG of each Month excluding Months w/zeroes计算每个月的平均值,不包括带/零的月份
【发布时间】:2014-05-09 18:07:31
【问题描述】:

我有以下工作查询,对每个月的长度列/值求和。

SELECT SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 1 THEN (tblcm.Lgth) ELSE 0 END) AS 'Jan',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 2 THEN (tblcm.Lgth) ELSE 0 END) AS 'Feb',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 3 THEN (tblcm.Lgth) ELSE 0 END) AS 'Mar',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 4 THEN (tblcm.Lgth) ELSE 0 END) AS 'Apr',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 5 THEN (tblcm.Lgth) ELSE 0 END) AS 'May',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 6 THEN (tblcm.Lgth) ELSE 0 END) AS 'Jun',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 7 THEN (tblcm.Lgth) ELSE 0 END) AS 'Jul',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 8 THEN (tblcm.Lgth) ELSE 0 END) AS 'Aug',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 9 THEN (tblcm.Lgth) ELSE 0 END) AS 'Sep',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 10 THEN (tblcm.Lgth) ELSE 0 END) AS 'Oct',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 11 THEN (tblcm.Lgth) ELSE 0 END) AS 'Nov',
   SUM(CASE WHEN DATE_FORMAT(tblcm.omActCompDate, '%m') = 12 THEN (tblcm.Lgth) ELSE 0 END) AS 'Dec',
   SUM(tblcm.Lgth) AS Total

给我以下信息:

Jan 13050
Feb 5200
Mar 48450
Apr 34041
May 38000
Jun 0
Jul 0
Aug 0
Sep 0
Oct 0
Nov 0
Dec 0

如何获得仅大于零月份的 AVG?

  • 我试过:avg(nullif(tblcm.Lgth, 0)) as m_Avg 但得到 1825
  • 我也试过: avg(case when tblcm.Lgth = 0 then null else tblcm.Lgth end) as m_Avg 但也得到 1825

  • 我需要得到 27748(这是 1 月到 5 月的总和,除以 5 个月)

【问题讨论】:

  • 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集。
  • 您是否需要从同一查询中获取平均每月总和细分?还是您现在真的只关心平均值?或者您可以使用一个查询来完成一个查询,而另一个查询来完成另一个查询?
  • 类似:SUM(tblcm.Lgth) / COUNT(DISTINCT IF(tblcm.Lgth=0, NULL, MONTH(tblcm.omActCompDate))

标签: mysql


【解决方案1】:

我很确定您需要一个子查询来做到这一点。以下假设您的原始查询在发布时是正确的,并且如您所说的那样起作用。这是未经测试的,您可能本可以在您的问题中包含更多详细信息,所以如果这不符合您的需求,现在让我来。

SELECT AVG(sumLgth) AS avgLgth, SUM(sumLgth) AS totalLgth,
    SUM(CASE WHEN theMonth = 1 THEN (tbl.sumLgth) ELSE 0 END) AS 'Jan',
    SUM(CASE WHEN theMonth = 2 THEN (tbl.sumLgth) ELSE 0 END) AS 'Feb',
    ...
FROM (
    SELECT MONTH(omActCompDate) AS theMonth, SUM(lgth) AS sumLgth
    FROM tblcm
    GROUP BY MONTH(omActCompDate)
    HAVING sumLgth > 0
) tbl

【讨论】:

  • 这应该也可以。虽然在 SELECT 列中可能需要 .sumLgth 而不是 .lgth
  • @ebyrob 很好。我在原始文章之后为这些列添加了别名。
  • ebyrob,您的解决方案效果最好,因为我需要将它与我的其余查询代码一起使用。 (是的,我需要月份总和加上平均值)最终有效的代码:------------------------ SUM(tblcm.Lgth) / COUNT(DISTINCT IF(tblcm.Lgth=0, NULL, MONTH(tblcm.omActCompDate))) (缺少第三个右括号......)ps:感谢PatrickQ的帮助......非常感谢!
  • ebyrob,刚刚注意到我需要改进这个解决方案: - 我真的只需要“排除“未来”中的月份。 - 例如,当“当前月份 = 5 月”时,我需要 1 月至 5 月的 AVG(包括零),即使一个月可能有“0”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 2021-08-22
相关资源
最近更新 更多