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