[英]MySQL Count that includes months not within the date range
假設我有一個包含以下表的表:
+----+-----------+---------+-------------------------+
| id | item | .... | dateLogged |
+----+-----------+---------+-------------------------+
| 1 | 2015-001 | .... | 2015-06-01 12:09:00 |
| 2 | 2015-001 | .... | 2015-06-01 12:09:00 |
| 3 | 2015-002 | .... | 2015-06-30 15:40:02 |
| 4 | 2015-002 | .... | 2015-06-30 15:40:03 |
| 5 | 2015-003 | .... | 2015-07-02 13:38:22 |
+----+-----------+---------+-------------------------+
我想根據年份,月份從dateLogged中搜索項目數,並使用預期數據:
+--------+----------+----------------+
| year | month | total |
+--------+----------+----------------+
| 2015 | January | 0 |
| 2015 | February | 0 |
| 2015 | March | 0 |
| 2015 | April | 0 |
| 2015 | May | 0 |
| 2015 | June | 4 |
| 2015 | July | 1 |
| 2015 | August | 0 |
| 2015 | September| 0 |
| 2015 | October | 0 |
| 2015 | November | 0 |
| 2015 | December | 0 |
+--------+----------+----------------+
但是我只能基於以下SQL來獲取它:
SELECT DATE_FORMAT(dateLogged, '%Y') as 'year', MONTHNAME(dateLogged)
as 'month', COUNT(id) as 'total' from item a where dateLogged >= '2015-06-29 00:00:00'
and dateLogged <= '2015-07-02 23:59:59'
GROUP BY DATE_FORMAT(a.dateLogged, '%Y%m');
+--------+---------+----------------+
| year | month | No of items |
+--------+---------+----------------+
| 2015 | June | 4 |
| 2015 | July | 1 |
+----+-------------+----------------+
我曾嘗試從stackoverflow的其他位置進行搜索,但無法獲得任何答案,或者可能錯過了。 想知道是否有任何解決方案,謝謝。
我正在使用Java進行計算,因此也歡迎使用Java進行上述計算的任何建議。
您也可以使用循環迭代數月和數年然后查找計數,來更改查詢以返回0值。 像這樣:
Map<String, Integer> values = new HashMap<String, Integer>();
for(int year = 2015; year < 2017; year++)
{
for(int month = 1; month <= 12; month++)
{
rs = stmt.executeQuery("SELECT COUNT(id) as 'total' from item where
MONTH(dateLogged) = " + month + " and YEAR(dateLogged) = " + year + ";";
rs.next();
int count = rs.getInt("total");
String time = Integer.toString(year) + "-" + Integer.toString(month);
values.Add(time, count);
}
}
這將為您返回如下地圖:
values['2015-1'] = 0;
values['2015-2'] = 0;
.. 等等。
當然,您可以根據需要將返回的計數與年和月一起存儲,具體取決於您希望如何進一步使用它。
一個想法是以某種方式創建日歷表並使用它,以便您在2015年的每個月都有一行:
SELECT DATE_FORMAT(m, '%Y') as 'year',
MONTHNAME(m) as 'month',
COUNT(id) as 'total'
FROM (SELECT '2015-01-01' AS m UNION ALL SELECT '2015-02-01' UNION ALL
SELECT '2015-03-01' UNION ALL SELECT '2015-04-01' UNION ALL
SELECT '2015-05-01' UNION ALL SELECT '2015-06-01' UNION ALL
SELECT '2015-07-01' UNION ALL SELECT '2015-01-08' UNION ALL
SELECT '2015-09-01' UNION ALL SELECT '2015-10-01' UNION ALL
SELECT '2015-11-01' UNION ALL SELECT '2015-12-01') AS x
LEFT JOIN item a
ON DATE_FORMAT(a.dateLogged, '%Y%m') = DATE_FORMAT(x.m, '%Y%m')
AND dateLogged >= '2015-06-29 00:00:00'
AND dateLogged <= '2015-07-02 23:59:59'
GROUP BY DATE_FORMAT(x.m, '%Y%m');
上面的查詢利用排序此表用作一個基礎,2015年的在線日歷表的FROM
子句,因此該查詢返回每個 2015年的幾個月內排。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.