我有两张桌子。组织和回归表格。
ReturnForm结构是:
| formID | returnMonth | returnYear | orgID |
组织每月提交退货表格。 returnMonth和returnYear存储表单的月/年,orgID是组织提交表单的fk,formID是returnForm表的pk。
我想计算有多少组织没有特定月/年组合的returnForm。对于一个月/一年,这很容易:
SELECT count(*)
FROM `tblOrganisations` AS `Organisation`
LEFT JOIN `tblReturnForms` AS `NoForm`
ON ( `NoForm`.`orgID` = `Organisation`.`orgID`
AND `NoForm`.`returnMonth` = 3
AND `NoForm`.`returnYear` = 2010 )
WHERE `NoForm`.`formID` IS NULL
我遇到的问题是计算在12/2005和当月之间没有提交的表格数量。我可以通过在2005年12月之间运行每月/每年的约查询并将它们相加来计算它,但我确信有一种更好,更优雅的方法。
答案 0 :(得分:0)
您可以像这样计算所需的最早年份和月份:
min_year = current_year;
min_month = current_month - 4;
if min_month < 1 then
min_month = 12 + min_month;
min_year = min_year - 1;
end if;
create temp table periods(year integer, month integer);
for month/year in(12/2005 .. min_month/min_year)
insert into periods values (year, month);
loop;
然后在SQL语句中使用它们,如下所示:
SELECT
`periods`.`year`,
`periods`.`month`,
count(*),
FROM
`tblOrganisations` AS `Organisation`
JOIN periods
LEFT JOIN `tblReturnForms` AS `NoForm` ON
(`NoForm`.`orgID` = `Organisation`.`orgID`
AND
`NoForm`.`returnYear` = `period`.`year`
AND
`NoForm`.`returMonth` <= `periods`.`month`))
WHERE
`NoForm`.`formID` IS NULL
GROUP BY
`periods`.`year`,
`periods.`month`
这将为您提供每个返回类型/月/年的缺失回报数 - 所有这些都在一个查询中 - 然后只是循环结果。