0

我有loneink每个个人 ID ( ) 的 2007年年收入 ( ) personlopnr,我想计算每个公司 ID ( peorglopnr) 支付给 1980 年之后出生的工人(出生年份为fodelsear)的总工资账单的总额。但是,下面的代码会生成一share列,绝大多数情况下为 0,其余情况下为 1。(需要说明的是,WHERE loneink > 0下面的代码只产生 1——没有那个条件的零回归,并且有一个NULLIF来确保我永远不会被零除。)虽然有很多公司没有年轻工人,但显然情况并非如此所有其他公司都是年轻的。

这里有什么问题?这不是产生“年轻工资”变量的方法,其中年长工人的收入为零,所以总和只适用于年轻人?或者理论上这是可以的,但我CASE WHEN错了?或者SUM/SUM行为不端GROUP BY

有什么更好的方法来做到这一点?

CREATE VIEW sys.over26_2007 (personlopnr,peorglopnr,loneink,below26_loneink) AS (
SELECT personlopnr,peorglopnr,loneink, CASE WHEN fodelsear < 1981 THEN 0 ELSE loneink END AS below26_loneink
FROM sys.ds_chocker_lev_lisaindivid_2007 WHERE loneink > 0
);
SELECT COUNT(*) FROM over26_2007;

CREATE VIEW sys.share26_2007 (peorglopnr,share26_2007) AS (
SELECT peorglopnr, SUM(below26_loneink)/SUM(loneink)
FROM sys.over26_2007
WHERE loneink > 0
GROUP BY peorglopnr
);

我的实际用例是在 MonetDB 中,所以希望我们可以只坚持 SQL:2003 解决方案,没有 mySQL 或 Oracle 扩展。

4

1 回答 1

1

首先,当你创建视图时,你需要在你的case语句中使用0.0。这将确保视图中的列是使用正确的数据类型创建的(在您的情况下为双精度):

CREATE VIEW sys.over26_2007 (personlopnr,peorglopnr,loneink,below26_loneink) AS (
SELECT personlopnr,peorglopnr,loneink, 
       CASE WHEN fodelsear < 1981 THEN 0.0 ELSE loneink END AS below26_loneink
FROM sys.ds_chocker_lev_lisaindivid_2007 WHERE loneink > 0.0
);

接下来,在您的另一个观点中,将总和也加倍:

CREATE VIEW sys.share26_2007 (peorglopnr,share26_2007) AS (
SELECT peorglopnr, CAST(SUM(below26_loneink) AS double) / CAST(SUM(loneink) AS double)
FROM sys.over26_2007
WHERE loneink > 0
GROUP BY peorglopnr
);
于 2014-06-12T23:56:17.563 回答