Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 满足条件的子样本集料比的计算_Sql_Case_Aggregate Functions_Case When_Monetdb - Fatal编程技术网

Sql 满足条件的子样本集料比的计算

Sql 满足条件的子样本集料比的计算,sql,case,aggregate-functions,case-when,monetdb,Sql,Case,Aggregate Functions,Case When,Monetdb,我有每个个人2007年的年度收入loneink,我想计算每个公司ID员工的工资总额,1980年后出生的工人的工资总额是多少,出生年份是福德塞尔。但是,下面的代码生成了一个share列,对于绝大多数情况,该列为0,对于其余情况,该列为1。需要明确的是,下面的代码中loneink>0只产生1s——零返回,没有这个条件,并且有一个NULLIF以确保我永远不会被零除。虽然有许多公司没有年轻工人,但显然并非所有其他公司都是年轻人 这里怎么了?这不是产生年轻工资变量的方法,因为老年工人的收入为零,所以总和只

我有每个个人2007年的年度收入loneink,我想计算每个公司ID员工的工资总额,1980年后出生的工人的工资总额是多少,出生年份是福德塞尔。但是,下面的代码生成了一个share列,对于绝大多数情况,该列为0,对于其余情况,该列为1。需要明确的是,下面的代码中loneink>0只产生1s——零返回,没有这个条件,并且有一个NULLIF以确保我永远不会被零除。虽然有许多公司没有年轻工人,但显然并非所有其他公司都是年轻人

这里怎么了?这不是产生年轻工资变量的方法,因为老年工人的收入为零,所以总和只针对年轻人?或者在理论上这是可以的,但我得到的情况是什么时候错了?或者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扩展。

首先,在创建视图时,您需要在case语句中使用0.0。这将确保在您的情况下使用正确的数据类型double创建视图中的列:

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
);

您是否尝试分别列出SUMbelow26_loneink和SUMloneink列?在这种情况下,可能需要将SUM的结果转换为十进制类型或MonetDB中所称的任何类型,然后divide@cha我确实在2007年的26年中检查了loneink和below26_loneink的最小值、平均值和最大值。效果很好。这不意味着总数不应该是个问题吗?或者我遗漏了什么?你的孤独链接是什么类型的?@cha你在视图中的意思是什么?我如何质疑这一点?MonetDB没有信息模式,我无法从表中选择26个以上的2007,因为它是一个视图。没关系。。。试试这个:CASTSUMbelow26_loneink作为double/CASTSUMloneink作为double。顺便说一句,当您创建列时,在CASE语句中使用0.0,如下所示:CASE when fodelsear<1981然后0.0 ELSE loneink END
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
);