计算外表中没有条目的项目数

时间:2011-08-18 12:24:43

标签: mysql

我有两张桌子。组织和回归表格。

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月之间运行每月/每年的约查询并将它们相加来计算它,但我确信有一种更好,更优雅的方法。

1 个答案:

答案 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`

这将为您提供每个返回类型/月/年的缺失回报数 - 所有这些都在一个查询中 - 然后只是循环结果。