2011-05-20 40 views
2

我使用Oracle 10g和我有一個表叫下載基本上是這樣的:具有第一列靜電標籤兩列SQL數查詢

ID  DOWNLOAD_DATE 
1  2011-02-10 
2  2011-03-10 
3  2011-04-10 
4  2011-05-10 
5  2011-01-11 
6  2011-04-22 
7  2011-02-18 
8  2011-03-14 
9  2011-02-01 
10  2011-01-31 

我想執行返回以下內容的查詢:

Downloads today 
Downloads yesterday 
Downloads from start date until today 
Downloads on start date 
Downloads on day after start date 

我想將結果打印在兩列中。在第一列中,我想放置一個靜態標籤,就像上面的那個。在第二列中,伯爵。

我已經試過這樣的事情:

select count(id) from downloads where download_date = '2007-08-06' 
union 
select count(id) from downloads where download_date = '2007-08-08' 

但是,這裏有兩個問題。一,它只打印一列,計數。二,如果沒有給定日期(或日期範圍)的數據,則不打印任何內容。我需要打印一個零。

於是我嘗試了這樣的事情:

select download_date, count(download_date) from downloads where download_date = '2007-08-06' 
group by download_date 
union 
select download_date, count(download_date) from downloads where download_date > '2007-08-08' 
group by download_date 

這將返回兩列,但第一列不是一成不變的,它在數據庫(download_date)的字段。更重要的是,它返回多行查詢選擇日期範圍(其中download_date>'2007-08-08'),而我只想要一行,其數量。

我該怎麼做?

非常感謝, 鮑勃

回答

0

只要把靜態的標籤,您的每一個選擇在工會的版本是這樣的:

所有的
SELECT 'some label', ... 
UNION 
... 
3

第一。爲此,請使用Union All。聯盟將剝離雙記錄,這可能不是你想要的這種情況。這不會有太大影響,但是工會也會更快。 ;)

其次,我不明白爲什麼你不只是把能在靜態的標籤,就像這樣:

select 'Look, static' from dual 

然後,你可以寫這樣的查詢:

select 
    'Downloads today' as Caption, 
    count(*) as DownloadCount 
from 
    Downloads where trunc(download_date) = trunc(sysdate) 
union all 
select 
    'Downloads yesterday' 
    count(*) 
from 
    Downloads where trunc(download_date) = trunc(sysdate) - 1 

計數打印0如果沒有數據。

+0

非常感謝,這就像一個魅力工作! – Bob 2011-05-21 12:19:07

+0

@Bob:你會想把它標記爲答案。 – 2011-08-05 22:04:57