2016-04-11 80 views
1

我需要一個單一的查詢,這將給結果如我在下面給出選擇查詢輸出

createddate recordcount acceptdate submitdate createddate 
27-MAR-16     24    36   11 
28-MAR-16     79    207   58 

參考我提供一些疑問,我想合併成一個單一查詢

select trim(date_created) createddate,count(*) recordcount 
    from man 
    where status IN ('CREATED')and date_created>sysdate-15 
    group by trim(date_created) ORDER BY  TO_DATE(createddate,'DD/MM/YYYY'); 

此查詢的結果如下。此查詢的

createddate recordcount 
27-MAR-16  11 
28-MAR-16  58 

第二查詢

select trim(DATE_SUB) submitdate,count(*) recordcount 
from man 
where status IN ('SUBMITTED')and DATE_SUB>sysdate-15 
group by trim(date_sub) ORDER BY TO_DATE(submitdate,'DD/MM/YYYY'); 

結果就像

submitdate recordcount 
27-MAR-16 36 
28-MAR-16 207 

和第三個查詢就像是 -

select trim(DATE_PUB) acceptdate,count(*) recordcount 
from man 
where status IN ('ACCEPTED')and DATE_PUB>sysdate-15 
group by trim(DATE_PUB) ORDER BY TO_DATE(acceptdate,'DD/MM/YYYY'); 

acceptdate recordcount 
27-MAR-16  24 
28-MAR-16  79 

我怎麼能合併這三種查詢,以便我可以統計所有單身查詢?這會給我造成像

createddate recordcount acceptdate submitdate createddate 
27-MAR-16     24    36   11 
28-MAR-16     79    207   58 
+1

我能看到的唯一區別是在第二個查詢中缺少「group by」。您能否添加一些幫助我們重現問題的示例數據? –

+4

第一個查詢按'date_c'過濾,第二個按'date_p'過濾。他們可能會不同。 –

回答

1

你的第一個querywhere子句date但第二querywhere子句DATE_P

嘗試這樣

SELECT Trim(date) createddate, 
    COUNT(*) recordcount, 
    SUM(case when status = 'A' then 1 else 0 end) as a, 
    SUM(case when status = 'S' then 1 else 0 end) as s, 
    SUM(case when status = 'C' then 1 else 0 end) as c, 
    SUM(case when status = 'R' then 1 else 0 end) as r 
FROM man 
WHERE status IN ('A','S','C','R')and date >sysdate-15 
GROUP BY trim(date) ORDER BY createddate; 
+0

計數會忽略空值,因此應該給出與原始查詢相同的結果。 –

+0

我updeated我的問題更好understanding.the現在你可以給我提供這個解決方案 – suraha

+0

你@suraha第一次查詢'那裏clause'有''日期,但第二個查詢'那裏clause'有'DATE_P'。哪一個是正確的? –

1

你似乎想計數每個狀態類型,每一天。第一步是產生你感興趣的所有日期,你可以用做:

select trunc(sysdate) + 1 - level as dt 
from dual 
connect by level <= 15; 

然後,您可以(外)加入到您的實際表,其中的任何三個日期欄的匹配產生的日期,擴大你的情況條件來檢查你看這一個:

with t as (
    select trunc(sysdate) + 1 - level as dt 
    from dual 
    connect by level <= 15 
) 
select t.dt, 
    count(*) as recordcount, 
    count(case when status = 'ACCEPTED' and trunc(m.date_pub) = t.dt 
    then 1 end) as acceptdate, 
    count(case when status = 'SUBMITTED' and trunc(m.date_sub) = t.dt 
    then 1 end) as submitdate, 
    count(case when status = 'CREATED' and trunc(m.date_created) = t.dt 
    then 1 end) as createddate 
from t 
left join man m 
on (m.date_pub >= t.dt and m.date_pub < t.dt + 1) 
or (m.date_sub >= t.dt and m.date_sub < t.dt + 1) 
or (m.date_created >= t.dt and m.date_created < t.dt + 1) 
group by t.dt 
order by t.dt; 

我使用範圍檢查連接條件 - 如果你所有的日期欄設置在午夜目前尚不清楚,但它的更安全地假設他們可能有其他時間,並且你無法從匹配的日子中得到任何東西。

三個計數結果中的每一個現在都只是那些匹配狀態的行,其中特定日期列匹配,我認爲這是您想要的。我在這裏使用了trunc()而不是範圍比較,因爲它沒有潛在的性能損失,你可以在where子句中看到(從它可能會停止正在使用的索引)。

儘管取決於您的實際數據,但這可能會捨棄您的recordcount,因爲這將包含現在可能不符合任何案例條件的行。您可以重複案例條件,也可以使用內聯視圖來計算三個單獨計數的總和,具體取決於您希望包含的內容以及您最容易維護的內容。如果這些是您表格中唯一的三種狀態,那麼它可能與count(*)確定,但檢查它會得到您期望的值。

+0

更新我更好地理解查詢和問題你的狀態請看看這個現在 – suraha

+0

這不是一個更新,這是一個顯著重寫......據我可以看到這個答案仍然適用,你只需要三個日期想約而不是兩個? –

+0

從您的解決方案的結果是無效的我的情況,因爲在每一個狀態都像日)亞和DATE_CREATED和all..so在這種情況下,數據庫中的所有字段中時,在條件它永遠不會去或條件這次來到意味着我得到的地方insted的的第一條件計,或者如果需要 – suraha