gpt4 book ai didi

MySQL - 按月计数(包括丢失的记录)

转载 作者:行者123 更新时间:2023-11-29 02:52:06 28 4
gpt4 key购买 nike

我有这个选择:

SELECT
DATE_FORMAT(`created`, '%Y-%m') as byMonth,
COUNT(*) AS Total
FROM
`qualitaet`
WHERE
`created` >= MAKEDATE(year(now()-interval 1 year),1) + interval 5 month
AND
`status`=1
GROUP BY
YEAR(`created`), MONTH(`created`)
ORDER BY
YEAR(`created`) ASC

得到这个结果:

| byMonth | Total |
| 2015-06 | 2 |
| 2015-09 | 12 |
| 2015-10 | 3 |
| 2015-12 | 8 |
| 2016-01 | 1 |

参见 SQL-Fiddle here

WHERE 子句很重要,因为在我的示例中,我需要它作为从 6 月 1 日开始的当前财政年度。

如您所见,我没有 7 月、8 月和 11 月的记录。但我需要总计为零的这些记录。

所以我的结果应该是这样的:

| byMonth | Total |
| 2015-06 | 2 |
| 2015-07 | 0 |
| 2015-08 | 0 |
| 2015-09 | 12 |
| 2015-10 | 3 |
| 2015-11 | 0 |
| 2015-12 | 8 |
| 2016-01 | 1 |

有没有办法得到这个结果?

最佳答案

您需要生成所有需要的日期,然后将您的数据左联接到这些日期。另请注意,将一些谓词放在左连接的 ON 子句中,并将其他谓词放在 WHERE 子句中很重要:

SELECT
CONCAT(y, '-', LPAD(m, 2, '0')) as byMonth,
COUNT(`created`) AS Total
FROM (
SELECT year(now()) AS y UNION ALL
SELECT year(now()) - 1 AS y
) `years`
CROSS JOIN (
SELECT 1 AS m UNION ALL
SELECT 2 AS m UNION ALL
SELECT 3 AS m UNION ALL
SELECT 4 AS m UNION ALL
SELECT 5 AS m UNION ALL
SELECT 6 AS m UNION ALL
SELECT 7 AS m UNION ALL
SELECT 8 AS m UNION ALL
SELECT 9 AS m UNION ALL
SELECT 10 AS m UNION ALL
SELECT 11 AS m UNION ALL
SELECT 12 AS m
) `months`
LEFT JOIN `qualitaet` q
ON YEAR(`created`) = y
AND MONTH(`created`) = m
AND `status` = 1
WHERE STR_TO_DATE(CONCAT(y, '-', m, '-01'), '%Y-%m-%d')
>= MAKEDATE(year(now()-interval 1 year),1) + interval 5 month
AND STR_TO_DATE(CONCAT(y, '-', m, '-01'), '%Y-%m-%d')
<= now()
GROUP BY y, m
ORDER BY y, m

以上是如何工作的?

  • CROSS JOIN 创建一个 cartesian product在所有可用年份和所有可用月份之间。这就是您想要的,您希望所有年月组合都没有间隙。
  • LEFT JOIN 将所有 qualitaet 记录添加到结果(如果它们存在)并将它们连接到之前的年月笛卡尔积。将像 status = 1 谓词这样的谓词放在这里很重要。
  • COUNT(created) 仅计算 created 的非 NULL 值,即当 LEFT JOIN 为任何给定年份不生成任何行时 -月,我们希望结果是 0,而不是 1,即我们不想计算 NULL 值。

性能说明

上面的代码在您的 ONWHERE 谓词中大量使用了字符串操作和日期时间算法。这不会对大量数据执行。在这种情况下,您最好在 qualitaet 表中预先截断和索引您的年月,并仅对这些值进行操作。

关于MySQL - 按月计数(包括丢失的记录),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34557199/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com