【问题标题】:Mysql sum of count distinct grouped by month按月分组的不同计数的Mysql总和
【发布时间】:2015-08-03 07:54:50
【问题描述】:

手头确实有棘手的问题。 我如何计算由此提供的用户总数。

SELECT 
MONTH(VisitTime) AS mon, 
COUNT( distinct IP) AS usersbymonth
FROM stats 
WHERE 
YEAR( VisitTime) = YEAR(  current_date  )  
GROUP BY mon

棘手的问题是,汇总和计数(不同的 IP)提供了更低的 计数(全年不同)。那是因为 GROUP BY mon 允许同一个 IP 存在多个月份。

现在结果显示基本正确。 Month number|usersbymonth,如果您执行去年的目标查询,它将导致 12 个月前的用户数。

那么我如何计算 usersbymonth 单元格的总和?

【问题讨论】:

  • 因此,如果您在 1 月和 3 月都有用户 X 从 IP 进入,您只希望将其计为 1 次访问,而您当前的查询将其计为 2 次不同的访问?您必须进行单独的查询并按年分组,因为每月分组会破坏对那些“不同”访问进行不同操作的任何机会。
  • 显示的基本查询按照我的意愿执行所有操作。 3 月和 1 月访问的用户被计为 2。我只想计算所有月份的总和,这样我就可以计算当月用户的百分比

标签: mysql


【解决方案1】:

我说的对吗?

SELECT mon, SUM(usersbymonth) FROM 
  (SELECT 
  MONTH(VisitTime) AS mon, 
  COUNT( distinct IP) AS usersbymonth
  FROM stats 
  WHERE 
  YEAR( VisitTime) = YEAR(  current_date  )  
  GROUP BY mon)

如果您想每个月添加GROUP BY mon 更新

  SELECT 
      MONTH(VisitTime) AS mon, 
      COUNT( distinct IP) AS usersbymonth
  FROM stats 
  WHERE 
      YEAR( VisitTime) = YEAR(  current_date  )  
  GROUP BY mon
  UNION -- Last ROW
  SELECT mon, SUM(usersbymonth) FROM (
    SELECT 
      MONTH(VisitTime) AS mon, 
      COUNT( distinct IP) AS usersbymonth
    FROM stats 
    WHERE 
      YEAR( VisitTime) = YEAR(  current_date  )  
    GROUP BY mon)

【讨论】:

  • 基本上是的。结果还可以,但是..第二个只是以更复杂的方式完成我的工作。第一个结果只是我正在寻找的数字,但我只想让总数成为第 13 行或一个查询中每一行的额外列
  • 你的意思是你想要最后一行的总结果是吗?
  • 是的。像这样。 1 月 50 日、2 月 50 日、3 月 50 日等总共 150 个,但按月仍然不同
  • 所以 sum(usersbymonth) 将提供正确的答案.. 但是他**我如何将它实现到查询:)
  • 感谢 Molderf。现在工作正常,但需要重新考虑,因为它的查询速度非常慢。
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
相关资源
最近更新 更多