简体   繁体   English

MySQL每日总计按星期几计算

[英]MySQL day-on-day totals by day of the week

My shopping cart revenue appears to vary by day of the week, with Monday and Thursday being low days, Wednesday and Saturday being high days. 我的购物车收入似乎每周都有所不同,周一和周四是低天,周三和周六是高天。 I would therefore like to display a web page showing totals like this: 因此,我想显示一个显示如下总数的网页:

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.

I can query for a given day of the week like this: 我可以像这样查询一周中的某一天:

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

which gives me the daily totals for all Sundays in the past 12 weeks. 这给了我过去12周所有星期日的每日总数。 I can therefore do 7 queries to get what I need (1 query for each day of the week). 因此,我可以进行7次查询以获得我需要的信息(每周一天的1个查询)。 It seems like I ought to be able to get the whole thing in a single query. 看起来我应该能够在一个查询中得到整个东西。

What should the query be? 该查询应该是什么? Thanks! 谢谢!

EDIT: Here is the corrected query from the preferred solution. 编辑:这是来自首选解决方案的更正查询。

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

Group by week then day? 按星期分组然后是一天?

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

Should give you a result like this: 应该给你这样的结果:

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

you are actually looking for a type of pivot table query. 您实际上正在寻找一种数据透视表查询。

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 )

you might have to adjust the WHERE clause to truly get 12 full weeks if you are in the middle of a week... such as changing NOW() to something like date_add( now(), interval -weekday(now()) ), but I'd have to think more on that part. 你可能需要调整WHERE子句才能真正获得12个星期,如果你在一周的中间...比如将NOW()改为date_add(now(),interval -weekday(now())) ,但我必须在这一部分考虑更多。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM