选择子查询中的计数函数

时间:2015-08-18 11:02:46

标签: sql postgresql select count subquery

我试图解决下面的问题,但无法让它完全正常工作,所以真的需要一些帮助。我想要得到的结果如下:

正在运作的部分

  • hrs_hours表中存储为外键的人员编号
  • 存储在prs_personel表中的全名
  • hrs_hours表
  • 中所有正常小时数的总和(以秒为单位)
  • hrs_hours的所有ort(特殊)小时数的总和(以秒为单位) 表

无效的部分

  • hrs_taskname =' Partus Assistentie'并且在一个特定年份由一名工作人员在周末进行整整一个月。
  • hrs_taskname =' Partus Assistentie'并且由工作人员在工作日执行特定年份的整个月。

查询结果:

没有放置图片的权利,所以希望以这种方式清楚结果。

  • hrs_prs_fkey(整数):6,11
  • prs_fullname(text):name 1,name 2
  • normal_time(双精度):46800,461340
  • ort_time(双精度):29700,116100
  • partusass_weekend:0,0
  • partusass_week:2,2

在结果中,您可以看到partusass_week是一年中这些任务的总量。然而,他们都执行了总计2的任务中的1个,因此我希望它们显示1和1而不是2和2.我应该如何短语my(select count ... etc ...)子查询为了得到我想要的结果?

SELECT hrs_prs_fkey, 
prs_fullname, 
SUM(EXTRACT (epoch FROM hrs_normaltime)) AS normal_time, 
SUM(EXTRACT (epoch FROM hrs_orttime)) AS ort_time, 

(SELECT Count(hrs_taskname) AS partusass_weekend FROM hrs_hours 
WHERE hrs_taskname = 'Partus Assistentie'
AND EXTRACT(MONTH FROM "hrs_date") = 7 
AND EXTRACT(YEAR FROM "hrs_date") = 2015
AND extract(dow from hrs_date) in (0,6)), 

(SELECT Count(hrs_taskname) AS partusass_week FROM hrs_hours 
WHERE hrs_taskname = 'Partus Assistentie' 
AND EXTRACT(MONTH FROM "hrs_date") = 7 
AND EXTRACT(YEAR FROM "hrs_date") = 2015
AND extract(dow from hrs_date) in (1,2,3,4,5))

FROM hrs_hours 
LEFT JOIN prs_personel ON hrs_hours.hrs_prs_fkey = prs_personel.prs_pkey 
WHERE EXTRACT(MONTH FROM "hrs_date") = 7 
AND EXTRACT(YEAR FROM "hrs_date") = 2015 
GROUP BY hrs_prs_fkey, prs_fullname 
ORDER BY hrs_prs_fkey ASC

提前感谢您阅读和思考。

1 个答案:

答案 0 :(得分:0)

我认为你只想要条件聚合:

SELECT hrs_prs_fkey, prs_fullname, 
       SUM(EXTRACT(epoch FROM hrs_normaltime)) AS normal_time, 
       SUM(EXTRACT(epoch FROM hrs_orttime)) AS ort_time, 
       SUM(CASE WHEN hrs_taskname = 'Partus Assistentie' AND
                     extract(dow from hrs_date) in (0, 6)
                 THEN 1 ELSE 0 END
           END),
       SUM(CASE WHEN hrs_taskname = 'Partus Assistentie' AND
                     extract(dow from hrs_date) in (1, 2, 3, 4, 5)
                 THEN 1 ELSE 0 END
           END)
FROM hrs_hours LEFT JOIN
     prs_personel
     ON hrs_hours.hrs_prs_fkey = prs_personel.prs_pkey 
WHERE EXTRACT(MONTH FROM hrs_date) = 7 AND
      EXTRACT(YEAR FROM hrs_date) = 2015 AND
GROUP BY hrs_prs_fkey, prs_fullname 
ORDER BY hrs_prs_fkey ASC