2012-05-13 45 views
1

我有一个查询,显示根据日期收到的消息计数。 对于EG:即使没有数据,也可以显示表中的数据!甲骨文

1 | 1-May-2012 
3 | 3-May-2012 
4 | 6-May-2012 
7 | 7-May-2012 
9 | 9-May-2012 
5 | 10-May-2012 
1 | 12-May-2012 

正如你可以在某些日期看有没有收到任何消息。我要的是它应该显示所有的日期,如果有没有收到消息应该这样

1 | 1-May-2012 
0 | 2-May-2012 
3 | 3-May-2012 
0 | 4-May-2012 
0 | 5-May-2012 
4 | 6-May-2012 
7 | 7-May-2012 
0 | 8-May-2012 
9 | 9-May-2012 
5 | 10-May-2012 
0 | 11-May-2012 
1 | 12-May-2012 

显示0我怎样才能做到这一点时,有表中没有任何行?

回答

0

你不需要一个单独的表格,你可以在查询中创建你需要的东西。这适用于五月:

WITH month_may AS (
    select to_date('2012-05-01', 'yyyy-mm-dd') + level - 1 AS the_date 
    from dual 
    connect by level < 31 
) 
SELECT * 
    FROM month_may mm 
    LEFT JOIN mytable t ON t.some_date = mm.the_date 

日期范围将取决于你是如何做到这一点,你的范围是什么。

+0

嗨eaolson。我试过你的解决方案,我在1-31存储日期,并且留下了外部连接mytable日期列,但它只会显示匹配的日期列。请你帮助我吗? – Mohsin

+0

好吧我得到它的工作方式round.and它给了我匹配的结果和其他结果为null.Now我的问题是我希望所有这些空数据是来自该表的确切数据(数据是固定的固定的)和消息计数列为0 – Mohsin

+0

如果我正确理解您的问题,并且希望第一列为0而不是NULL,则可以使用NVL(column_name,0)对列进行任何操作。 – eaolson

0

您可以通过左外部连接实现此目的如果您有其他表加入到包含所有可能日期的表中,请参阅

一个选项可能是在临时表中生成日期并将其加入到查询中。

像这样的事情可能会伎俩。

CREATE TABLE #TempA (Col1 DateTime) 
DECLARE @start DATETIME = convert(datetime, convert(nvarchar(10), getdate(), 121)) 
SELECT @start 

DECLARE @counter INT = 0 

WHILE @counter < 50 
BEGIN 
    INSERT INTO #TempA (Col1) VALUES (@start) 
    SET @start = DATEADD(DAY, 1, @start) 
    SET @counter = @counter+1 
END 

这将创建一个TempTable来保存日期...我刚刚从今天开始生成了50个。

SELECT 
    a.Col1, 
    COUNT(b.MessageID) 
FROM 
    TempA a 
    LEFT OUTER JOIN YOUR_MESSAGE_TABLE b 
     ON a.Col1 = b.DateColumn 
GROUP BY 
    a.Col1 

然后你可以留下来加入你的消息。

+0

没有其他表包含日期。它是唯一的表,但我认为生成包含日期和连接或合并的临时表可能会给我想要的结果。 我对DBA语言不太熟悉,所以我将生成带有日期的临时数据表(c#)并将它与原始数据表合并在一起。这项工作是否会完成? – Mohsin

+0

是的,这将工作。我已经在上面添加了一些示例代码来演示如何。 –

+0

好吧,让我知道你的问题,我会回复给你。非常感谢你的指导。 – Mohsin

1

首先,它听起来像你的应用程序将受益于日历表。日历表是关于日期的日期和信息的列表。

其次,您可以在不使用临时表的情况下执行此操作。这里是方法:

with constants as (select min(thedate>) as firstdate from <table>) 
    dates as (select(<firstdate> + rownum - 1) as thedate 
       from (select rownum 
        from <table> cross join constants 
        where rownum < sysdate - <firstdate> + 1 
        ) seq 
      ) 
select dates.thedate, count(t.date) 
from dates left outer join 
    <table> t 
    on t.date = dates.thedate 
group by dates.thedate 

这是主意。别名常量记录表中最早的日期。别名日期然后创建日期序列。内部子查询使用rownum计算整数序列,然后将这些添加到第一个日期。请注意,假设您每个日期平均至少有一笔交易。如果没有,您可以使用更大的表格。

最后一部分是用于恢复日期信息的连接。请注意使用count(t.date)而不是count(*)。这将统计表中的记录数,对于没有数据的日期应该为0。