【问题标题】:Group by week and select records from current week按周分组并从当前周中选择记录
【发布时间】:2011-09-20 21:46:31
【问题描述】:

我一直在尝试使用 MySQL 显示每周销售结果表,其中一周的结果应该是这样的:

Sun - Mon - Tues - Wed - Thur - Fri - Sat

所以我继续使用这个查询:

SELECT DATE_FORMAT(cart_calendar.datefield, '%d-%b') AS DATE
        , IFNULL(SUM(cart_daily_sales.quantity),0) AS total_sales 
FROM cart_daily_sales 
RIGHT JOIN cart_calendar 
         ON (DATE(cart_daily_sales.order_date) = cart_calendar.datefield)
WHERE (cart_calendar.datefield) 
GROUP BY WEEK(cart_calendar.datefield)

我知道我快到了,因为这会输出一年中的所有 52 周,我只想要当前周的结果,这与上面的代码不同...

'02-Jan', '09-Jan', '16-Jan', '23-Jan', '30-Jan', '06-Feb', '13-Feb', '20-Feb', '27-Feb', '06-Mar' e.t.c....

我知道我可以将 BETWEEN 运算符用于今天的日期,然后是 -7 天,但这不会显示当前的一周,如果今天是星期三,它将显示最后 7 天到最后一周的星期三,而不是正确的星期结构。

如何按每周分组显示上周的销售额?

【问题讨论】:

    标签: mysql datetime group-by


    【解决方案1】:
     SELECT DATE_FORMAT(cc.datefield, '%d-%b') AS DATE
            , SUM(IFNULL(cds.quantity,0)) AS total_sales 
     FROM cart_calendar cc
     INNER JOIN cart_daily_sales cds
             ON (DATE(cds.order_date) = cc.datefield)
     WHERE WEEK(cc.datefield) = WEEK(now())
     GROUP BY WEEK(cc.datefield)
    

    或者如果你想要每天:

     SELECT DATE_FORMAT(cc.datefield, '%d-%b') AS DATE
            , SUM(IFNULL(cds.quantity,0)) AS total_sales 
     FROM cart_calendar cc
     INNER JOIN cart_daily_sales cds
             ON (DATE(cds.order_date) = cc.datefield)
     WHERE WEEK(cc.datefield) = WEEK(now())
     GROUP BY MOD(WEEKDAY(cc.datefield)+1,6) WITH ROLLUP
    

    【讨论】:

    • 最后一件事我注意到第 18 周的开始,周日像这样落在最后:['19-Sep', '20-Sep', '21-Sep', '22 -Sep', '23-Sep', '24-Sep', '18-Sep'] 我怎样才能把 18-Sep 放在前面?
    • @Matt,weekday() 坚持认为星期一是一周的第一天,不像 week(),它将星期日视为第一天。用一个额外的mod 子句为你修复了它。
    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多