【问题标题】:Grouping two dates as one in Oracle-SQL在 Oracle-SQL 中将两个日期分组为一个
【发布时间】:2013-04-23 13:00:34
【问题描述】:

我有一个包含三个相关字段的表“任务”:date_created、date_updated 和 is_closed。

我有一个简单的查询来计算创建的任务数:

SELECT task.date_created, count(task.is_closed)
FROM task
GROUP BY task.date_created
ORDER BY task.date_created

我还想要每天关闭的任务数量。就我们而言,任务的最终更新日期是 is_closed='true'

所以,决赛桌应该是这样的

date      opened  closed
04/01/13  8       6
04/02/13  9       5

【问题讨论】:

  • 您似乎缺少WHERE task.is_closed=1(假设is_closed 的类型为BIT

标签: sql oracle date count group-by


【解决方案1】:

您可以在您的COUNT 中使用CASE 语句:

SELECT task.date_created, 
    count(1) opened, 
    count(case when is_closed = 'true' then 1 end) closed
FROM task
GROUP BY task.date_created
ORDER BY task.date_created

SQL Fiddle Demo

鉴于您的 cmets,这是一种使用一对 Common Table Expressions 的方法:

WITH OPENED AS (
    SELECT date_created, count(1) opened
    FROM task
    GROUP BY date_created
  ) ,
CLOSED AS (
    SELECT date_updated, count(1) closed
    FROM task
    WHERE is_closed = 'true'
    GROUP BY date_updated
  )
SELECT D.YourDateField, o.opened, c.closed
FROM YourDateTable D
    LEFT JOIN Opened O ON D.YourDateField = O.Date_Created
    LEFT JOIN CLosed C ON D.YourDateField = C.Date_Created

正如 Gordon 所指出的,FULL OUTER JOIN 也可以。我只是更喜欢使用日期表来播种。创建表一次,然后在需要的任何地方使用它。

【讨论】:

  • 这似乎是朝着正确方向迈出的一步,但并非所有任务都在打开的同一天关闭,因此 date_updated 字段。
  • 我包含了一个 SQL Fiddle 演示供您查看。最初在您的帖子中没有看到有关不同日期字段的任何内容,但听起来您需要使用子查询来返回所需的结果。
  • @MattMcD -- 这是一个更新的小提琴:sqlfiddle.com/#!4/01bd7/1 -- 与上面 Gordon 的帖子非常相似。使用子查询,如果需要,使用完整的外连接。最好的问候。
【解决方案2】:

我认为您需要将其作为两个子查询来执行。这是一种方法,使用full outer join

select coalesce(a.date_created, c.date_updated) as thedate,
       coalesce(a.opened, 0) as opened,
       coalesce(c.closed, 0) as closed
from (select date_created, count(*) as opened
      from task
      group by date_created
     ) a full outer join
     (select date_updated, count(*) as closed
      from task
      where is_closed = 1  -- or whatever the value is
      group by date_updated
     ) c
     on a.date_created = c.date_updated

full outer join 保证所有日期都存在,即使您只有关闭或打开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 2021-08-16
    • 2021-02-22
    • 2021-07-30
    • 2021-10-10
    • 1970-01-01
    • 2016-01-23
    • 2021-02-14
    相关资源
    最近更新 更多