方法,您可以根据需要添加其他条件。我喜欢此解决方案:)在接受之前,我会调查我的问题。Postgres要求我在每个案例中添加END语句。这是标准SQL还是postgres决定需要的东西当jobs.status\u id=5,然后1 ELSE 0结束活动\u计

方法,您可以根据需要添加其他条件。我喜欢此解决方案:)在接受之前,我会调查我的问题。Postgres要求我在每个案例中添加END语句。这是标准SQL还是postgres决定需要的东西当jobs.status\u id=5,然后1 ELSE 0结束活动\u计,sql,query-optimization,subquery,Sql,Query Optimization,Subquery,方法,您可以根据需要添加其他条件。我喜欢此解决方案:)在接受之前,我会调查我的问题。Postgres要求我在每个案例中添加END语句。这是标准SQL还是postgres决定需要的东西当jobs.status\u id=5,然后1 ELSE 0结束活动\u计数时的情况否则它会向我抛出异常。@nzignab这不是postgres独有的。那是我的健忘。我更新了答案,只是想注意到执行时间减少了大约75%,谢谢:DI会想象性能是相似的,即使这种方法只使用1 SELECT.+1,但我仍然使用sum,例如su


方法,您可以根据需要添加其他条件。我喜欢此解决方案:)在接受之前,我会调查我的问题。Postgres要求我在每个
案例中添加
END
语句。这是标准SQL还是postgres决定需要的东西<代码>当jobs.status\u id=5,然后1 ELSE 0结束活动\u计数时的情况
否则它会向我抛出异常。@nzignab这不是postgres独有的。那是我的健忘。我更新了答案,只是想注意到执行时间减少了大约75%,谢谢:DI会想象性能是相似的,即使这种方法只使用1 SELECT.+1,但我仍然使用sum,例如
sum(当jobs.status\u id不在(8,3,11)中时,则使用1 ELSE 0 END)
。使用
COUNT
可以利用
COUNT
忽略空值这一事实,而不是每个人都意识到这一点。@Conrad:这一点很好。我认为这个决定取决于个人喜好。在我看来,当你试图计算某物的数量时,我更清楚地看到了计数,但这两种方法都很好。)我知道你的意思,SUM(active_COUNT)active_COUNT看起来很有趣
SELECT
  (SELECT count(*)
    FROM "jobs"
    WHERE
      jobs.creator_id = 5 AND
      jobs.status_id NOT IN (8,3,11) /* 8,3,11 being 'inactive' related statuses */
  ) AS active_count, 
  (SELECT count(*)
    FROM "jobs"
    WHERE
      jobs.creator_id = 5 AND
      jobs.due_date < '2011-06-14' AND
      jobs.status_id NOT IN(8,11,5,3) /* Grabs the overdue active jobs
                                      ('5' means completed successfully) */
  ) AS overdue_count,
  (SELECT count(*)
    FROM "jobs"
    WHERE
      jobs.creator_id = 5 AND
      jobs.due_date BETWEEN '2011-06-14' AND '2011-06-15 06:00:00.000000'
  ) AS due_today_count
  SELECT
    SUM(active_count) active_count,
    SUM(overdue_count) overdue_count
    SUM(due_today_count) due_today_count
  FROM 
  (

  SELECT 
    CASE WHEN jobs.status_id NOT IN (8,3,11) THEN 1 ELSE 0 END active_count,
    CASE WHEN jobs.due_date < '2011-06-14' AND jobs.status_id NOT IN(8,11,5,3)  THEN 1 ELSE 0 END  overdue_count,
    CASE WHEN jobs.due_date BETWEEN '2011-06-14' AND '2011-06-15 06:00:00.000000' THEN 1 ELSE 0 END  due_today_count

    FROM "jobs"
    WHERE
      jobs.creator_id = 5 ) t
   HAVING SUM(active_count) is not null
 SELECT
      COALESCE(SUM(active_count)) active_count,
       COALESCE(SUM(overdue_count)) overdue_count
      COALESCE(SUM(due_today_count)) due_today_count
 SELECT
      COUNT(CASE WHEN 
            jobs.status_id NOT IN (8,3,11) THEN 'Manticores Rock' ELSE NULL
       END) as [active_count]
SELECT 
    COUNT(CASE WHEN 
        jobs.status_id NOT IN (8,3,11) THEN 1 
    END) as [Count1],
    COUNT(CASE WHEN 
        jobs.due_date < '2011-06-14' 
        AND jobs.status_id NOT IN(8,11,5,3) THEN 1
    END) as [COUNT2],
    COUNT(CASE WHEN
            jobs.due_date BETWEEN '2011-06-14' AND '2011-06-15 06:00:00.000000'
    END) as [COUNT3]
FROM 
    "jobs"
WHERE 
     jobs.creator_id = 5 
IIF ( boolean_expression, true_value, false_value )
SELECT 
    COUNT(
        IIF(jobs.status_id NOT IN (8,3,11), 1, 0)
    ) as active_count,
    COUNT(
        IIF(jobs.due_date < '2011-06-14' AND jobs.status_id NOT IN(8,11,5,3), 1, 0)
    ) as overdue_count,
    COUNT(
        IIF(jobs.due_date BETWEEN '2011-06-14' AND '2011-06-15 06:00:00.000000', 1, 0)
    ) as due_today_count
FROM 
    "jobs"
WHERE 
     jobs.creator_id = 5