按sql分组的年度表的聚合变化(monetdb)

按sql分组的年度表的聚合变化(monetdb),sql,group-by,aggregate-functions,sql-view,monetdb,Sql,Group By,Aggregate Functions,Sql View,Monetdb,我的数据包括许多工人的年度表格(例如,file2006,file2007),包括雇主ID和公司ID。我还通过一些计算(下面的组)查看了集团公司,这些计算似乎很好,因此没有显示。然而,我认为我可以通过使用下面的代码进行分组来计算2006年至2007年各公司总工资账单的变化。这并不是对以前的视图进行快速计算,而是使系统长时间停滞,最后出现一些关于映射问题的错误消息。那么正确的方法是什么呢 CREATE VIEW sys.change2007 (firmid,groups,wagebillchange

我的数据包括许多工人的年度表格(例如,
file2006
file2007
),包括雇主ID和公司ID。我还通过一些计算(下面的
)查看了集团公司,这些计算似乎很好,因此没有显示。然而,我认为我可以通过使用下面的代码进行分组来计算2006年至2007年各公司总工资账单的变化。这并不是对以前的视图进行快速计算,而是使系统长时间停滞,最后出现一些关于映射问题的错误消息。那么正确的方法是什么呢

CREATE VIEW sys.change2007 (firmid,groups,wagebillchange) AS (
SELECT file2006.firmid,MAX(groups.groups), (
    SELECT SUM(file2007.wage)/SUM(file2006.wage) FROM file2006, file2007
    WHERE file2006.firmid = file2007.firmid
    )
FROM file2006, file2007, groups
WHERE file2006.firmid = file2007.firmid AND file2006.peorglopnr = groups.firmid
GROUP BY file2006.firmid
);

决不能在
from子句中使用
s。在你的例子中,问题是因为你在做一个笛卡尔积,从一年到下一年,每个公司的员工。因此,如果一家公司每年有100名员工,那么您需要为该公司处理10000行

解决方案是预先聚合结果。您应该能够这样做:

SELECT f006.firmid, f2007.wage / f2006.wage as ratio
FROM (select firmid, sum(wage) as wage
      from file2006
      group by firmid
     ) f2006 join
     (select firmid, sum(wage) as wage
      from file2007
      group by firmid
     ) f2007
     on f2006.firmid = f007.firmid;

我无法从您的查询中看出
表的意图,但您应该能够在此基础上进行构建。

谢谢,但我在这个表中发现一个错误,告诉我选择标识符(firmid)不明确…(我也有兴趣加入groups表,它已经聚合到firmids,但我无法让它工作,我总是得到
子查询表需要别名,
,即使我以类似方式扩展了您的示例。)
select
语句是错误的,因为聚合是在子查询中完成的。这基本上回答了原来的问题。虽然如果我只要求
select AVG(ratio),我会得到一个
除以零的错误从wagebillchange_2007
中,在使用select创建的视图上,我不明白为什么以前不会发生这种情况(分区在视图中),那么为什么部门对生成NAs的能力不强呢?哦,如果我尝试加入
表,我仍然会得到
子查询引用表需要一个引用
错误,但是我可以为这个问题提出一个新问题…