-1

表结构是,

Table name: btq_user

name, email, kall, state_id, datain

现在我想每周计算 kall = 1 或 state_id in( 51, 20, 46) 的数字记录。无论年份是否变化,我都只需要每周(周一 - 周日)的结果。例如,31-12-2012 是星期一,6-1-2013 是星期日,所以结果应该包括一周。无论年份是否变化,它都应该只计算几周。

这是我尝试但没有工作的方法。

SELECT 
count( if( A.state_id = 51 or A.state_id = 20 or A.state_id = 46, A.state_id,
null  ) ) AS state_total, count( if( A.kall =1, A.kall, null ) ) AS appointment, 
CONCAT( WEEK( A.datain) , " - 
", YEAR( A.datain ) ) AS week
FROM btq_user A
GROUP BY week
ORDER BY A.datain ASC

还有没有可能显示周(31-12-2012-6-1-2013)的结果?

感谢您阅读我的问题。

4

1 回答 1

3

两个步骤:

一,您需要一个星期截断操作——这将取走您的DATETIME项目并在前一个星期日的午夜归还(如果您的业务规则规定该周从星期日开始)。

这成为一个合适的 GROUP BY 项目。WEEK() / YEAR() hack 不适合这个。每年的最后/第一周真的很乱。

根据我的经验,这个表达式会为你做星期截断技巧,星期天 - 星期六,

  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

要获得星期一 - 星期日的周数,请使用此表达式。

  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))

所以你可以这样做。

  SELECT COUNT(whatever), SUM(whatelse),
         FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) as WEEKSTART,
    FROM TABLE
   GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))

如何在 MySQL 中按周分组?

其次,您需要在截断的日期上加上六天,这样您就可以显示每周的最后一天和第一天。

这是一个很好的方法,使用嵌套查询

SELECT whats, elses, weekstart, weekstart + INTERVAL 6 DAY AS weekend
  FROM (
  SELECT COUNT(whatever) AS whats, SUM(whatelse) AS elses,
         FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) AS weekstart,
    FROM TABLE
   GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))
  ) AS summary
ORDER BY weekstart

做很多这样的事?我建议你创建一个存储TRUNC_WEEK函数。

于 2013-08-17T11:58:23.307 回答