我在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
如何在不使用函数的情况下进行查询?我听说观点是最好的方式,但我不知道如何制作它。
答案 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;