查询仅显示观看次数

时间:2015-05-09 02:11:03

标签: mysql sql postgresql

我在mysql中也有这些寄存器(也在postgresql中):

Venta   
date        amount
01/02/2015  7
10/02/2015  8
10/02/2015  9
20/03/2015  4
20/03/2015  11
25/04/2015  1

所以,我想查询一下我每天得到的总金额,如果当天的金额不存在,则显示0的日期。这样的事情:

date        amount
01/01/2015  0
02/01/2015  0
03/01/2015  0
04/01/2015  0
05/01/2015  0
06/01/2015  0
.  .   .    .
.  .   .    .
01/02/2015  7
.  .   .    .
.  .   .    .
10/02/2015  17
.  .   .    .
.  .   .    .
20/03/2015  15
.  .   .    .
.  .   .    .
25/04/2015  1
.  .   .    .
.  .   .    .
30/12/2015  0
31/12/2015  0

如何在不使用函数的情况下进行查询?我听说观点是最好的方式,但我不知道如何制作它。

3 个答案:

答案 0 :(得分:3)

你可以在Postgres中轻松完成这个:

select dates.dte, coalesce(sum(v.amount), 0) as amount
from generate_series('2015-01-01'::timestamp, '2015-12-31'::timestamp, '1 day'::interval) dates(dte) left join
     venta v
     on v.date = dates.dte
group by dates.dte
order by dates.dte;

除非你有一个日历表,否则这在MySQL中会更加麻烦。

答案 1 :(得分:0)

创建一个包含所需日期的日历表,然后进行连接。

答案 2 :(得分:0)

而不是具有连续日期列表的表,只需定义所谓的数字或计数表。它只是一个一列的连续整数值,从1或0到一些荒谬的限制。然后,该表将提供一种方法,将字母表中的字母或范围中的日期或索引排序为varchar或您需要的任何内容。

我称之为Tally,一个字段为Num,值从零开始,而不是一个。

select  t.Num
from    Tally t
where   t.Num between 0 and 6;

这提供七个连续值或一周的日期值。您需要做的就是设定起点。

select  t.Num, StartDate + t.Num DateValue
from    Tally t
where   t.Num between 0 and 6;

现在将其与您的桌子和小组相关联。

select  StartDate + t.Num VentaDate, Coalesce( Sum( m.Amount ), 0 ) DailyAmount 
from    Tally t
left join MyTable m
    on  m.Venta = StartDate + t.Num
group by StartDate + t.Num
where   t.Num between 0 and 6;