2013-04-29 72 views
2

我有一個包含三個相關字段的表'task':date_created,date_updated和is_closed。在Oracle中將兩個日期分組爲一個SQL-SQL

我有一個統計創建的任務數的簡單查詢:

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

我想是還每天封閉任務的數量。對於我們來說,任務的最後更新日期爲is_closed =「真」

所以,最後的表應該像

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

您似乎錯過了'WHERE task.is_closed = 1'(假設'is_closed'類型爲'BIT') – 2013-04-29 18:38:25

回答

0

您可以使用CASE語句時,你COUNT

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

考慮您的意見,這裏是用一對夫婦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也可以工作。我只是更喜歡使用日期表來播種。創建表格一次,並在需要的地方使用它。

+0

似乎是朝着正確方向邁出的一步,但並非所有任務都在相同的方向上關閉他們被打開的一天,因此date_updated字段。 – 2013-04-29 18:39:42

+0

我包含一個SQL小提琴演示供您查看。最初沒有看到您的文章中關於不同日期字段的任何內容,但您聽起來像需要使用子查詢來返回您想要的結果。 – sgeddes 2013-04-29 18:48:15

+0

@MattMcD - 這是一個更新的小提琴:http://sqlfiddle.com/#!4/01bd7/1 - 與Gordon的帖子非常相似。使用子查詢,如果需要的話,使用完整的外部聯接。最好的祝福。 – sgeddes 2013-04-29 19:00:01

0

我認爲你需要做這兩個子查詢。這是一種方法,使用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保證所有的日期都存在,即使你只有關閉或打開。