【问题标题】:MySQL day-on-day totals by day of the weekMySQL 每天按一周中的一天计算的总数
【发布时间】:2013-02-06 11:56:10
【问题描述】:

我的购物车收入似乎因一周中的每一天而异,周一和周四是淡季,周三和周六是旺季。因此,我想显示一个显示总计的网页,如下所示:

Week #    Sun    Mon    Tue    Wed    Thu    Fri    Sat
Week 1   $5.00  $1.00  $3.00  $9.00  $1.00  $3.00  $9.00
Week 2   $5.23  $1.07  $2.98  $8.75  $0.02  $3.14  $7.51
Week 3   etc.

我可以像这样查询一周中的某一天:

SELECT count( id ) AS orders, 
       order_date, 
       date_format( order_date, '%a' ) AS weekday, 
       sum( total) AS revenue
FROM `ss_orders`
WHERE dayofweek( order_date ) = 1
      AND order_date >= date_add( now( ) , INTERVAL -83 DAY )
GROUP BY order_date
ORDER BY order_date DESC

这给了我过去 12 周内所有星期日的每日总数。因此,我可以进行 7 次查询来获得我需要的信息(一周中的每一天都有 1 次查询)。似乎我应该能够在一个查询中得到整个事情。

查询应该是什么?谢谢!

编辑:这是来自首选解决方案的更正查询。

SELECT 
  week( o.order_date ) as WkNumber,
  sum( if( weekday( o.order_date ) = 6, 1, 0 ) * o.total ) as SalesSun,
  sum( if( weekday( o.order_date ) = 6, 1, 0 )) as OrdersSun,
  sum( if( weekday( o.order_date ) = 0, 1, 0 ) * o.total ) as SalesMon,
  sum( if( weekday( o.order_date ) = 0, 1, 0 )) as OrdersMon,
  sum( if( weekday( o.order_date ) = 1, 1, 0 ) * o.total ) as SalesTue,
  sum( if( weekday( o.order_date ) = 1, 1, 0 )) as OrdersTue,
  sum( if( weekday( o.order_date ) = 2, 1, 0 ) * o.total ) as SalesWed,
  sum( if( weekday( o.order_date ) = 2, 1, 0 )) as OrdersWed,
  sum( if( weekday( o.order_date ) = 3, 1, 0 ) * o.total ) as SalesThu,
  sum( if( weekday( o.order_date ) = 3, 1, 0 )) as OrdersThu,
  sum( if( weekday( o.order_date ) = 4, 1, 0 ) * o.total ) as SalesFri,
  sum( if( weekday( o.order_date ) = 4, 1, 0 )) as OrdersFri,
  sum( if( weekday( o.order_date ) = 5, 1, 0 ) * o.total ) as SalesSat,
  sum( if( weekday( o.order_date ) = 5, 1, 0 )) as OrdersSat,
  sum( o.total ) as SalesWeek,
  sum( 1 ) as OrdersWeek
from
  ss_orders o
where
  o.order_date > date_add( now(), INTERVAL -13 WEEK )
group by
  week( o.order_date )
order by o.order_date desc

【问题讨论】:

    标签: mysql


    【解决方案1】:

    按周然后按天分组?

    SELECT count( id ) AS orders, 
           date_format( order_date, '%a' ) AS weekday, 
           WEEK(order_date) AS week_number,
           sum( total) AS revenue
    FROM 
           `ss_orders`
    WHERE 
           order_date >= date_add( now( ) , INTERVAL -83 DAY )
    GROUP BY 
           WEEK(orderdate), DAY(orderdata)
    ORDER BY 
           order_date DESC
    

    应该给你这样的结果:

    orders | weekday | week_number | revenue
    5        Sun       1             20
    6        Mon       1             15
    ...
    

    【讨论】:

    • 两种解决方案都有效,希望我能同时采用!但确实数据透视表是我想要的。
    【解决方案2】:

    您实际上是在寻找一种数据透视表查询。

    SELECT 
          week( o.order_date ) as WkNumber,
          sum( if( weekday( o.order_date ) = 6, 1, 0 ) * o.total ) as SalesSun,
          sum( if( weekday( o.order_date ) = 6, 1, 0 ) as OrdersSun,
          sum( if( weekday( o.order_date ) = 0, 1, 0 ) * o.total ) as SalesMon,
          sum( if( weekday( o.order_date ) = 0, 1, 0 ) as OrdersMon,
          sum( if( weekday( o.order_date ) = 1, 1, 0 ) * o.total ) as SalesTue,
          sum( if( weekday( o.order_date ) = 1, 1, 0 ) as OrdersTue,
          sum( if( weekday( o.order_date ) = 2, 1, 0 ) * o.total ) as SalesWed,
          sum( if( weekday( o.order_date ) = 2, 1, 0 ) as OrdersWed,
          sum( if( weekday( o.order_date ) = 3, 1, 0 ) * o.total ) as SalesThu,
          sum( if( weekday( o.order_date ) = 3, 1, 0 ) as OrdersThu,
          sum( if( weekday( o.order_date ) = 4, 1, 0 ) * o.total ) as SalesFri,
          sum( if( weekday( o.order_date ) = 4, 1, 0 ) as OrdersFri,
          sum( if( weekday( o.order_date ) = 5, 1, 0 ) * o.total ) as SalesSat,
          sum( if( weekday( o.order_date ) = 5, 1, 0 ) as OrdersSat,
          sum( o.total ) as SalesWeek,
          sum( 1 ) as OrdersWeek
       from
          ss_orders o
       where
          o.order_date > date_add( now(), INTERVAL -12 WEEK )
       group by
          week( o.order_date )
    

    如果你在一个星期的中间,你可能需要调整 WHERE 子句才能真正获得 12 个完整的星期......例如将 NOW() 更改为类似 date_add( now(), interval -weekday(now()) ),但我必须在这方面考虑更多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 2018-08-04
      相关资源
      最近更新 更多