【问题标题】:Count function in select subquery选择子查询中的计数函数
【发布时间】:2015-11-11 06:48:13
【问题描述】:

我正在尝试解决下面的查询,但无法使其完全正常工作,因此真的需要一些帮助。我想要得到的结果如下:

正在工作的部分

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

不工作的部分

  • hrs_taskname = 'Partus Assistentie' 的任务计数,由人员成员在特定年份的整个月内于周末执行。
  • hrs_taskname = 'Partus Assistentie' 的任务计数,由工作人员在特定年份的整个月内的工作日执行。

查询结果:

无权放置图片,因此希望通过这种方式获得清晰的结果。

  • hrs_prs_fkey(整数):6、11
  • prs_fullname(文本):名称 1,名称 2
  • normal_time(双精度):46800、461340
  • ort_time(双精度):29700、116100
  • partusass_weekend: 0, 0
  • partusass_week: 2, 2

在结果中,您可以看到 partusass_week 是一年中这些任务的总量。但是,他们都执行了其中一项任务,总计 2,因此我希望他们显示 1 和 1 而不是 2 和 2。我应该如何表达我的(选择计数 ...等...)子查询为了得到我想要的结果?

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

提前感谢您的阅读和思考。

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: sql postgresql select count subquery


【解决方案1】:

我认为您只需要条件聚合:

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

【讨论】:

  • 非常感谢 Gordon Linoff,它似乎工作了! :D
  • @Inikassor:在 Postgres 中,您还可以使用稍短的:count(*) where (hrs_taskname = 'Partus Assistentie' AND extract(dow from hrs_date) in (1, 2, 3, 4, 5)) 代替 case 语句。
  • @a_horse_with_no_name 。 . . filter 在这样的表达式中是可选的吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多