Sql 仅当组中的所有记录都符合条件时才分组并返回结果

Sql 仅当组中的所有记录都符合条件时才分组并返回结果,sql,postgresql,Sql,Postgresql,数据库结构如下所示: 他有很多计划 计划有很多工作 乔布斯有很多用户工作 我正在尝试将所有为特定地址完成的工作分组,而不考虑计划 从那里,我只想看到的地址,没有一个成功的工作完成 当UserJobs.performance=ontime或UserJobs.performance=late时,工作成功 SELECT "addresses"."address1", "user_jobs"."performance" FROM "addresses" JOIN "plans" ON "a

数据库结构如下所示:

他有很多计划 计划有很多工作 乔布斯有很多用户工作

我正在尝试将所有为特定地址完成的工作分组,而不考虑计划

从那里,我只想看到的地址,没有一个成功的工作完成

当UserJobs.performance=ontime或UserJobs.performance=late时,工作成功

SELECT
  "addresses"."address1",
  "user_jobs"."performance"

FROM
  "addresses" JOIN "plans" ON "addresses"."id" = "plans"."address_id" 
  JOIN "jobs" ON "plans"."id" = "jobs"."plan_id" 
  JOIN "user_jobs" ON "jobs"."id" = "user_jobs"."job_id"

group by   
  "addresses"."address1",
  "user_jobs"."performance"
我尝试构建上面的查询,但我已经看到了其中的缺陷。它将按地址分组,但如果该地址内有不同的性能,它将进行拆分

如果要计算成功完成的工作量,可以使用条件聚合:

SELECT
  "addresses"."address1",
  COUNT(CASE 
           WHEN "user_jobs"."performance" IN ('ontime', 'late') THEN 1
        END) AS cnt  
FROM
  "addresses" JOIN "plans" ON "addresses"."id" = "plans"."address_id" 
  JOIN "jobs" ON "plans"."id" = "jobs"."plan_id" 
  JOIN "user_jobs" ON "jobs"."id" = "user_jobs"."job_id"    
GROUP BY   
  "addresses"."address1
如果要计算成功完成的工作量,可以使用条件聚合:

SELECT
  "addresses"."address1",
  COUNT(CASE 
           WHEN "user_jobs"."performance" IN ('ontime', 'late') THEN 1
        END) AS cnt  
FROM
  "addresses" JOIN "plans" ON "addresses"."id" = "plans"."address_id" 
  JOIN "jobs" ON "plans"."id" = "jobs"."plan_id" 
  JOIN "user_jobs" ON "jobs"."id" = "user_jobs"."job_id"    
GROUP BY   
  "addresses"."address1
“组中的所有记录都符合条件”->bool_和聚合函数

select "addresses"."address1" FROM
    "addresses" JOIN "plans" ON "addresses"."id" = "plans"."address_id" 
    JOIN "jobs" ON "plans"."id" = "jobs"."plan_id" 
    JOIN "user_jobs" ON "jobs"."id" = "user_jobs"."job_id"

   group by   
     "addresses"."address1"
   HAVING bool_and("user_jobs"."performance" IN ('ontime', 'late'))
“组中的所有记录都符合条件”->bool_和聚合函数

select "addresses"."address1" FROM
    "addresses" JOIN "plans" ON "addresses"."id" = "plans"."address_id" 
    JOIN "jobs" ON "plans"."id" = "jobs"."plan_id" 
    JOIN "user_jobs" ON "jobs"."id" = "user_jobs"."job_id"

   group by   
     "addresses"."address1"
   HAVING bool_and("user_jobs"."performance" IN ('ontime', 'late'))

对于当前Postgres版本,这也可以写为
count(*)过滤器(其中user_jobs.performance in('ontime','late'))
对于当前Postgres版本,这也可以写为
count(*)过滤器(其中user_jobs.performance in('ontime','late'))