我想显示最近30天的完整列表 这是我的疑问:
select Distinct DATE_FORMAT(transactions.transaction_date,'%c-%d-%Y') as transaction_date,sum(amount)as Amount from transactions group by DATE_FORMAT(transactions.transaction_date,'%c-%d-%Y')
这是我的查询结果:
但我想要
transaction_date Amount
1-01-2014 0
2-01-2014 0
直到我如何得到完整的结果?
答案 0 :(得分:1)
这里的典型方法是首先编写一个获取所需日期列表的查询,然后使用外部联接来关联有交易的范围内日期的交易金额。
我的建议是安装common_schema并使用common_schema.numbers表生成日期列表。
例如,您可以运行此类查询以获取最近30天(不包括今天):
select (current_date() - interval n day) as day
from common_schema.numbers
where n between 1 and 30
order by day
然后,您可以将其与现有查询结合使用,以获得所需的结果(我对您的查询进行了一些其他小的更改,以将其限制在相关的日期范围内,并使用DATE()
代替DATE_FORMAT()
为了简单起见):
select days.day, coalesce(transactions_rollup.total,0)
from
(
select (current_date() - interval n day) as day
from common_schema.numbers
where n between 1 and 30
) days
left outer join (
select date(transaction_date) as day, sum(amount) as total
from transactions
where transaction_date >= current_date() - interval 30 day
and transation_date < current_date()
group by date(transaction_date)
) transactions_rollup on transactions_rollup.day = days.day
order by days.day
答案 1 :(得分:0)
您需要的是生成器视图(类似于PostgreSQL generate_series()函数可获得的视图),其中包含月份的所有日期,没有间隙。不幸的是,MySQL没有这样的功能,因此您需要pregenerate the dates in some calendar table然后将原始查询加入其中,或依赖于某些big enough table。