2014-11-04 45 views
1

我试图做到这一点使用:选择并加入必须出现在GROUP BY错误子句或聚合函数

SELECT *, 
case when SUM(fld_allocated_time)/24 < fld_allocated_days 
then 'OK' 
else 'NOK' 
end as Alocated 
from 
(
SELECT tbl_project.fld_id, tbl_project.fld_allocated_days, 
tbl_project_timesheet.fld_allocated_time 
FROM "SD_PRJ".tbl_project 
INNER JOIN "SD_PRJ".tbl_project_timesheet 
ON tbl_project.fld_id=tbl_project_timesheet.fld_id 
) AS Alias 

,我得到这个错误:

ERROR: column "total.fld_id" must appear in the GROUP BY clause or be used in an aggregate function 
SQL state: 42803 
Character: 8 

TBL =表
FLD =列
SD_PRJ =架构名称

+0

该脚本不能产生该错误。在脚本中没有“total.fld_id”,我可以看到。除非在其中一个表上有触发器。 – 2014-11-04 20:08:02

回答

1

如果要计算一个总和查询的所有行,并与各行fld_allocated_days比较,那么你可以试试这个:

with Alias as (
SELECT * from (
    SELECT tbl_project.fld_id, tbl_project.fld_allocated_days, 
      tbl_project_timesheet.fld_allocated_time 
    FROM "SD_PRJ".tbl_project 
     INNER JOIN "SD_PRJ".tbl_project_timesheet 
     ON tbl_project.fld_id=tbl_project_timesheet.fld_id 
) 
select a.*, 
     case when b.sm < fld_allocated_days then 'OK' else 'NOK' end as Alocated 
from Alias a cross join 
    (select SUM(fld_allocated_time)/24 sm from Alias) b; 

不过,我想你需要这样的:

SELECT tbl_project.fld_id, 
     case when SUM(tbl_project_timesheet.fld_allocated_time)/24 
       < fld_allocated_days 
      then 'OK' 
      else 'NOK' 
     end as Alocated 
FROM "SD_PRJ".tbl_project 
    INNER JOIN "SD_PRJ".tbl_project_timesheet 
    ON tbl_project.fld_id=tbl_project_timesheet.fld_id 
GROUP BY tbl_project.fld_id, tbl_project.fld_allocated_days; 
+0

如何从输入参数(fld_project_id)中获取行的总和? 其中fld_project_id = @parameter – Alienware 2014-11-04 20:31:09

+0

@Alienware您需要计算每个fld_project_id的总和? – Multisync 2014-11-04 20:33:31

+0

@Alienware我已经更新了我的回答 – Multisync 2014-11-04 20:37:34

1

在选择列表中添加列的其余部分的GROUP BY

) AS Alias 
GROUP BY fld_id, fld_allocated_days, fld_allocated_time 
+0

哦,谢谢它的所有我需要的。 – Alienware 2014-11-04 20:19:10

相关问题