我有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 扩展。