[英]PHP/SQL - How to count saturdays in each month?
我有兩個 MySQL 表,稱為“帳戶”和“事件”。
帳戶
ID | 姓名 |
---|---|
1 | 皮特 |
2 | 喬希 |
3 | 哈利 |
活動
ID | 日期 | 帳戶ID |
---|---|---|
1 | 2021-10-09 | 1 |
2 | 2021-09-25 | 1 |
3 | 2021-10-23 | 2 |
4 | 2021-11-06 | 1 |
5 | 2021-10-13 | 1 |
6 | 2021-11-17 | 2 |
7 | 2021-11-06 | 3 |
8 | 2021-12-04 | 3 |
events 表中的 account_id 鏈接到 accounts 表中的 id。
我的問題是:對於帳戶表中的每個唯一用戶,我可以使用哪個查詢來計算每個月的星期六(日期 YYYY-mm-dd 格式)? 所以我得到了下一個結果:
姓名 | 九月 | 十月 | 十一月 | 十二月 |
---|---|---|---|---|
喬希 | 0 | 1 | 0 | 0 |
皮特 | 1 | 1 | 1 | 0 |
哈利 | 0 | 0 | 1 | 1 |
我已經嘗試了很多查詢(即(內部)JOIN、DISTINCT 和 GROUP BY 關鍵字),但我沒有得到確切的結果。 你能幫我么?
提前謝謝了!
使用WEEKDAY判斷日期是否為星期六
返回日期的工作日索引(0 = 星期一,1 = 星期二,... 6 = 星期日)。
SELECT
MAX(a.name) name
, (
SUM( CASE WHEN e.`date` between '2021-09-01' AND '2021-09-30' THEN 1 ELSE 0 END)
) "September"
, (
SUM( CASE WHEN e.`date` between '2021-10-01' AND '2021-10-31' THEN 1 ELSE 0 END)
) "October"
, (
SUM( CASE WHEN e.`date` between '2021-11-01' AND '2021-11-30' THEN 1 ELSE 0 END)
) "November"
, (
SUM( CASE WHEN e.`date` between '2021-12-01' AND '2021-12-31' THEN 1 ELSE 0 END)
) "December"
FROM Accounts a
LEFT JOIN Events e ON e.account_id = a.id AND WEEKDAY(e.`date`) = 5
GROUP BY a.id
;
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=2689e975b18f3a208fdda2d78b50b56c
基本上你可以使用 DAYOFWEEK 函數和 GROUP BY MONTH
SELECT
account_id,
MONTH(date),
COUNT(*)
FROM Events
WHERE DAYOFWEEK(date) = 7
GROUP BY account_id, MONTH(date);
以及何時可以在收到的表上使用 PIVOT,例如:
WITH res AS (
SELECT
account_id,
MONTH(date) mnth,
COUNT(*) cnt
FROM Events
WHERE DAYOFWEEK(date) = 7
GROUP BY account_id, MONTH(date)
) SELECT
account_id,
name,
SUM(mnth=1) Januar,
--
SUM(mnth=9) September,
SUM(mnth=10) October,
SUM(mnth=11) November,
SUM(mnth=12) December
FROM res
JOIN Accounts ON Accounts.id = account_id
GROUP BY account_id, name;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.