2013-12-08 51 views
3

我有一個表稱爲「訂單」具有下列數據:如何返回查詢結果,即使沒有出現的結果

Date  Order_No  Ship_Method 
------------------------------------- 
12/6/2013 1234567  RTS 
12/6/2013 7654321  
12/7/2013 3456789  RTS 
12/7/2013 9876543  
12/7/2013 1123456  RTS 
12/7/2013 5523847  RTS 
12/8/2013 8876549  
12/8/2013 7733654 

我需要一個查詢,將搜索數據的多少行有「RTS」在Ship_Method領域,並返回以下結果對於我運行查詢(如下圖所示)天:

Date  RTS_Shipments 
------------------------- 
12/8/2013   0 

C. - 安東尼

編輯

,對我有關上述問題的工作查詢如下(按Carth在回答部分provded):

select 
sub.tdate, 
count(orders.dt) 
from (select to_date(to_char((sysdate-1),'mmddYYYY'),'mmddYYYY') tdate from dual) sub 
left join orders on sub.tdate = orders.dt and orders.ship_method like '%RTS%' 
group by sub.tdate 
+0

在SQLFiddle,我試圖做這樣的事情: '選擇CASE WHEN TO_CHAR(DT, 'MM/DD/YYYY')爲null,則 TRUNC(SYSDATE)ELSE TO_CHAR (dt,'MM/DD/YYYY')END, CASE when COUNT(ship_method)is NULL THEN 0 ELSE COUNT(ship_method)END FROM orders WHERE trunc(dt)= trunc(SYSDATE - 1)AND ship_method Like' %RTS%' GROUP BY trunc(d '';' 但是不斷收到此錯誤消息: ORA-00932:不一致的數據類型:預期的DATE得到了CHAR:SELECT CASE WHEN to_char ... – aCarella

回答

2

爲了得到您需要的結果,您將需要爲您的選擇創建一個基礎,在該基礎中您正在過濾的術語明確存在,然後使用它加入到目標表中。在我最初的答案中,我認爲你可以直接從雙重選擇一個變量值,但是因爲我無法正確解決這個問題的語法,所以這裏有一些其他的想法。您可以創建一個新的「工作」表,其中包含您想要檢查的所有日期,然後根據該日期進行選擇並將其加入到目標表中,或者可以創建一個子查詢來保存您的預期值並將其用作您的基礎類似這樣的語句:

select 
    sub.tdate, 
    count(orders.dt) 
from (select to_date(to_char((sysdate-1),'mmddYYYY'),'mmddYYYY') tdate from dual) sub 
left join orders on sub.tdate = orders.dt and orders.ship_method like '%RTS%' 
group by sub.tdate 
+0

謝謝你的迴應,@Carth。 此代碼不起作用。當我在SQL Developer中運行它,我得到以下信息: ORA-00936:缺少表達 00936. 00000 - 「失蹤表達」 *原因: *動作: 行錯誤:1列:7 – aCarella

+0

@ aCarella - 我已經用一個工作示例更新了答案。我希望這有幫助。 – Carth

+0

這實際上幾乎可行。真棒。感謝你目前的幫助。 我在sqlfiddle中運行它,它確實會在我需要的列中顯示一個零和一個日期。 雖然我搞砸了,但我無法弄清楚如何自動化它,以便代替'120913',代碼會自動檢查今天的日期。任何想法如何在查詢的那一天做到這一點? – aCarella

1

您可以使用左連接在同一個表來獲取所有結果和結果你需要的。你需要你的那個人總結1和0爲你沒有的人。

應該這樣做。

SELECT to_char(o1.DT, 'MM/DD/YYYY') As "Date", 
     SUM(case when o1.Ship_Method is null then 0 else 1 end) As RTS_Shipments 
    FROM orders o1 
    left join orders o2 
     on (o1.dt = o2.dt and o2.Ship_Method like '%RTS%') 
WHERE trunc(o1.DT) = trunc(SYSDATE) 
GROUP BY to_char(o1.DT, 'MM/DD/YYYY') 

在看到它的小提琴:http://sqlfiddle.com/#!4/fd374/6

我已經改變了日期字段dt,原因是日期是一個保​​留字。

還有。此查詢可以計算每個日期,但它只會顯示您過濾日期的註冊表:trunc(o1.DT) = trunc(SYSDATE)如果您取出此條件,您將看到每個日期的正確計數。

+0

OP需要一行返回即使什麼都不符合where子句。 – Carth

+0

@Carth我已更正。 –

+0

考慮到OP的評論「當某一天沒有RTS出貨時出現問題」在你的示例中,如果選擇的是12/9而不是12/8,那麼會發生什麼情況。或者相反,如果您離開選擇查找SYSDATE,但更改模式將記錄從12/8移動到12/9? – Carth