具有静态标签的第一列的双列SQL计数查询

时间:2011-05-20 22:40:03

标签: sql oracle oracle10g

我使用的是Oracle 10g,我有一个名为downloads的表,基本上看起来像这样:

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'),而我只想要一行及其计数。

我该怎么做?

非常感谢, 鲍勃

2 个答案:

答案 0 :(得分:3)

首先。请使用Union All。 Union将删除双重记录,在这种情况下可能不是你想要的。这没关系,但工会一切也更快。 ;)

其次,我不明白为什么你不能只是放入一个静态标签,如下:

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。

答案 1 :(得分:0)

只需在联合版本的每个选项中添加一个静态标签,如下所示:

SELECT 'some label', ...
 UNION
 ...