2016-06-09 54 views
0

的DB結構如下:分組和返回結果,只有當組中所有記錄符合條件

地址有許多計劃 計劃有許多工作 喬布斯有許多UserJobs

我想無論計劃如何,將爲特定地址完成的所有工作分組。

從那裏,我只希望看到還沒有做

一個成功的作品成功的作品是時UserJobs.perfomance =準時或UserJobs.perfomance =晚

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" 

地址我試圖建立上面的查詢,但我已經可以看到它的缺陷。它將由地址組,但是如果有地址中的不同表現,將拆分

回答

1

您可以使用有條件的聚集如果要算成功完成工作:

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 
+1

與當前版本的Postgres這也可以寫爲'COUNT(*)過濾器(其中,在user_jobs.performance( '導通時間', '晚'))' –

1

「的所有記錄的組符合條件」 - > bool_and聚集函數

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')) 
相關問題