我有一个名为 GAINLP 的表该表包含字段
'Record#" (INT),
'SightingDate' (DATE),
'SpeciesName' (VARCHAR)
需要 SQL 输出一个数组,其中包含一个整数,该整数对应于每个月的 SightingDate 总和。
示例:0,0,0,0,1,5,10,12,5,3,0,0
相反,以下代码会导致跳过空值总和,我只剩下 1,5,10,12,5,3
`select count(SightingDate) from GAINLP where SpeciesName LIKE '%Actias luna' GROUP BY MONTH(SightingDate)`
我知道这可以通过与日历表连接来完成,但我还没有找到也使用 WHERE 运算符的此类代码示例。
您可以在此处使用条件聚合:
SELECT
MONTH(SightingDate) AS month,
COUNT(CASE WHEN SpeciesName LIKE '%Actias luna' THEN 1 END) cnt
FROM GAINLP
GROUP BY
MONTH(SightingDate);
但是,这可能不如基于日历表的连接方法有效。 以下是您可以执行此操作的方法:
SELECT
t1.month,
COUNT(t2.SightingDate) cnt
FROM (SELECT DISTINCT MONTH(SightingDate) AS month FROM GAINLP) t1
LEFT JOIN GAINLP t2
ON t1.month = MONTH(t2.SightingDate)
WHERE
t2.SpeciesName LIKE '%Actias luna'
GROUP BY
t1.month;
注意:您的数据可能跨越多个给定年份,在这种情况下,您可能希望同时报告年份和月份。
您似乎正在寻找条件聚合。原理是将筛选逻辑移动到聚合函数中的 CASE 构造。
SELECT
SUM(
CASE
WHEN SpeciesName LIKE '%Actias luna'
THEN 1
ELSE 0
END
)
GROM gainlp
GROUP BY MONTH(SightingDate)