简体   繁体   English

MySQL - 按星期几比较月份的数据 - 例如每个月第一个星期六的会话

[英]MySQL - Compare data from months by day of week - e.g. sessions on first Saturday of each month

I have a table recording when clients came for a session.当客户来参加会议时,我有一张桌子录音。 I want to create a graph that compares how many sessions were done in the last year.我想创建一个图表来比较去年完成的会话数。 I figured out how to get the results for each month with the following sql:我想出了如何使用以下 sql 获取每个月的结果:

SELECT
  DAY(`SessionDate`) as month_day, 
  SUM(if(MONTH(SessionDate) =  1, 1, 0))  AS Jan,
  SUM(if(MONTH(SessionDate) =  2, 1, 0))  AS Feb,
  SUM(if(MONTH(SessionDate) =  3, 1, 0))  AS Mar,
  SUM(if(MONTH(SessionDate) =  4, 1, 0))  AS Apr,
  SUM(if(MONTH(SessionDate) =  5, 1, 0))  AS May,
  SUM(if(MONTH(SessionDate) =  6, 1, 0))  AS Jun,
  SUM(if(MONTH(SessionDate) =  7, 1, 0))  AS Jul,
  SUM(if(MONTH(SessionDate) =  8, 1, 0))  AS Aug,
  SUM(if(MONTH(SessionDate) =  9, 1, 0))  AS Sep,
  SUM(if(MONTH(SessionDate) = 10, 1, 0))  AS 'Oct',
  SUM(if(MONTH(SessionDate) = 11, 1, 0))  AS 'Nov',
  SUM(if(MONTH(SessionDate) = 12, 1, 0))  AS 'Dec'
FROM sessions
WHERE
`SessionDate` >= NOW()-Interval 12 MONTH
GROUP BY DAY(`SessionDate`)
ORDER BY DAY(SessionDate)

The result looks something like this:结果如下所示:

------------------------------...
|month_day | Jan | Feb | Mar |...
------------------------------...
|         1|  1  |  2  |  0  |...
|         2|  2  |  3  |  1  |...
|         3|  0  |  4  |  1  |...
|         4|  0  |  4  |  2  |...
|         5|  4  |  3  |  3  |...
|         6|  2  |  1  |  4  |...
|         7|  2  |  0  |  4  |...
|         8|  1  |  2  |  4  |...
     ...

However, this compares every 1st of Jan to 1st of Feb to 1st of Mar... What I am trying to see and compare is how many sessions there were on the 1st Monday of every Month...然而,这比较了每年 1 月 1 日到 2 月 1 日到 3 月 1 日……我想查看和比较的是每个月的第一个星期一有多少个会话……

Say 1. Jan was a Friday, 1. Feb was a Tue and Mar started on a Wed then my result should be something like this:假设 1. Jan 是星期五,1. Feb 是星期二,Mar 是星期三,那么我的结果应该是这样的:

-----------------------------...
|weekday  | Jan | Feb | Mar |...
-----------------------------...
| 1st Mon |     |     |     |...
| 1st Tue |     |  2  |     |...
| 1st Wed |     |  3  |  1  |...
| 1st Thu |     |  4  |  0  |...
| 1st Fri |  1  |  4  |  1  |...
| 1st Sat |  2  |  3  |  1  |...
| 1st Sun |  0  |  1  |  2  |...
| 2nd Mon |  0  |  0  |  3  |...
| 2nd Tue |  4  |  2  |  4  |...
| 2nd Wed |  1  |  2  |  4  |...
| 2nd Thu |  1  |  2  |  4  |...
| 2nd Fri |  3  |  3  |  2  |...
| 2nd Sat |  4  |  1  |  0  |...
| 2nd Sun |  2  |  1  |  0  |...
| 3rd Mon |  0  |  0  |  1  |...
| 3rd Tue |  1  |  0  |  4  |...
     ...      etc

In other words, the graph will display which weekdays are popular (eg 1st Saturday of each month has more sessions than the 3rd Saturday) I draw the graph with php and Google static charts so that's no problem.换句话说,图表将显示哪些工作日是受欢迎的(例如,每个月的第一个星期六比第三个星期六有更多的会话)我用 php 和 Google 静态图表绘制图表,所以没问题。 Getting the monthly data to offset so the weekdays are in the same row is what I can't figure out.让每月数据抵消以使工作日在同一行中是我无法弄清楚的。 Hope my question makes sense.希望我的问题有意义。 I'm a hobby coder and new to stackoverflow so any help will be appreciated.我是一名业余编码员,也是 stackoverflow 的新手,因此我们将不胜感激。

This is the solution that I figured out.这是我想出的解决方案。 It looks a bit clunky but works.它看起来有点笨重但有效。 I am still open to a better solution.我仍然愿意接受更好的解决方案。

    
    SELECT  
     a.m AS CalPos, /* Calendar Position (not date) 
                       e.g. if the month starts on a Tues, 
                       the 1st would display in CalPos 2 */
     COALESCE(b.Jan,0) AS 'Jan',
     COALESCE(b.Feb,0) AS 'Feb',
     COALESCE(b.Mar,0) AS 'Mar',
     COALESCE(b.Apr,0) AS 'Apr',
     COALESCE(b.May,0) AS 'May',
     COALESCE(b.Jun,0) AS 'Jun',
     COALESCE(b.Jul,0) AS 'Jul',
     COALESCE(b.Aug,0) AS 'Aug',
     COALESCE(b.Sep,0) AS 'Sep',
     COALESCE(b.Oct,0) AS 'Oct',
     COALESCE(b.Nov,0) AS 'Nov',
     COALESCE(b.Dec,0) AS 'Dec'
    FROM (
        SELECT 1 AS m 
        UNION SELECT 2 AS m 
        UNION SELECT 3 AS m 
        UNION SELECT 4 AS m 
        UNION SELECT 5 AS m 
        UNION SELECT 6 AS m 
        UNION SELECT 7 AS m 
        UNION SELECT 8 AS m 
        UNION SELECT 9 AS m 
        UNION SELECT 10 AS m 
        UNION SELECT 11 AS m 
        UNION SELECT 12 AS m
        UNION SELECT 13 AS m
        UNION SELECT 14 AS m
        UNION SELECT 15 AS m
        UNION SELECT 16 AS m
        UNION SELECT 17 AS m
        UNION SELECT 18 AS m
        UNION SELECT 19 AS m
        UNION SELECT 20 AS m
        UNION SELECT 21 AS m
        UNION SELECT 22 AS m
        UNION SELECT 23 AS m
        UNION SELECT 24 AS m
        UNION SELECT 25 AS m
        UNION SELECT 26 AS m
        UNION SELECT 27 AS m
        UNION SELECT 28 AS m
        UNION SELECT 29 AS m
        UNION SELECT 30 AS m
        UNION SELECT 31 AS m
        UNION SELECT 32 AS m
        UNION SELECT 33 AS m
        UNION SELECT 34 AS m
        UNION SELECT 35 AS m
        UNION SELECT 36 AS m
        UNION SELECT 37 AS m
        UNION SELECT 38 AS m
    ) AS a
    LEFT JOIN 
    ( SELECT 
     CASE
        WHEN
        (7 - MOD((9-DAYOFWEEK(CAST(DATE_SUB(CONCAT(DATE_FORMAT(SessionDate,'%Y-%m-'),'01'), INTERVAL 7 DAY) AS DATE) )),7)) = 7
         THEN
         (DAY(`SessionDate`)+( MOD((9-DAYOFWEEK(CAST(DATE_SUB(CONCAT(DATE_FORMAT(SessionDate,'%Y-%m-'),'01'), INTERVAL 7 DAY) AS DATE) )),7)))
        ELSE
        (DAY(`SessionDate`)+(7 - MOD((9-DAYOFWEEK(CAST(DATE_SUB(CONCAT(DATE_FORMAT(SessionDate,'%Y-%m-'),'01'), INTERVAL 7 DAY) AS DATE) )),7)))
      END AS CalPos,   
      SUM(IF(MONTH(SessionDate) =  1, 1, 0))  AS 'Jan',
      SUM(IF(MONTH(SessionDate) =  2, 1, 0))  AS 'Feb',
      SUM(IF(MONTH(SessionDate) =  3, 1, 0))  AS 'Mar',
      SUM(IF(MONTH(SessionDate) =  4, 1, 0))  AS 'Apr',
      SUM(IF(MONTH(SessionDate) =  5, 1, 0))  AS 'May',
      SUM(IF(MONTH(SessionDate) =  6, 1, 0))  AS 'Jun',
      SUM(IF(MONTH(SessionDate) =  7, 1, 0))  AS 'Jul',
      SUM(IF(MONTH(SessionDate) =  8, 1, 0))  AS 'Aug',
      SUM(IF(MONTH(SessionDate) =  9, 1, 0))  AS 'Sep',
      SUM(IF(MONTH(SessionDate) = 10, 1, 0))  AS 'Oct',
      SUM(IF(MONTH(SessionDate) = 11, 1, 0))  AS 'Nov',
      SUM(IF(MONTH(SessionDate) = 12, 1, 0))  AS 'Dec'
    FROM sessions
    WHERE
    `SessionDate` >= NOW() - INTERVAL 12 MONTH
    GROUP BY CalPos
    ORDER BY CalPos
    
    ) AS b
      ON a.m = b.CalPos

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

相关问题 查找每月第n周的一天(例如,找到下个月第二周的第二周的星期五,知道本月第二周的星期五) - Find the day of every nth week of a month (e.g. find Friday of second week of next month knowing Friday the second week of this month) PHP-MYSQL:最近12个月到每个月的最后一天 - PHP - MYSQL: Last 12 months first to last day of each month 在 PHP 中只比较没有年份的日期和月份,例如出生日期 - Compare only day and month without year in PHP e.g. birth date 将一周开始日期从星期一更改为星期六 - Change the week start day from Monday to Saturday 如何在php中获取当月的第一周星期六日期? - How to Get First Week Saturday date of current month in php? 如何检测一周的第一天是星期六、星期日还是星期一? - How to detect if first day of the week is Saturday, Sunday, or Monday? 如何在html表(php)中从Mysql表显示特定时间段(天/周/月)的数据 - How to display data for a certain period of time (day / week / month) from Mysql table in html table (php) 6个月中的每周第一天 - Getting first day of every week in 6 months 使MySQL查询动态化的最佳方法(例如,更新查询参数以显示上周) - Best method for making a MySQL query dynamic (e.g., update query parameters to show Previous Week) 一个月中每周的第一个日期 - First Date of Each Week in a Month
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM