首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据库中获取每日和每月的总销售额

从数据库中获取每日和每月的总销售额
EN

Stack Overflow用户
提问于 2013-10-21 20:23:48
回答 2查看 3.6K关注 0票数 2

我有一个表,列c_datedatetimetotal为mysql中的int类型,我想打印出每天的销售,每个月的总销售,以及每年的总销售,包括日,月,年,其中没有销售。

目前,对于日常销售,我运行以下查询:

代码语言:javascript
复制
mysql> select date(c_date) as date, sum(total) as total_sale from sale group by date;
+------------+------------+
| date       | total_sale |
+------------+------------+
| 2013-10-3  |        798 |
| 2013-10-6  |        114 |
+------------+------------+

但是,我想要这样的东西:

代码语言:javascript
复制
mysql> select date(c_date) as date, sum(total) as total_sale from sale group by date;
+------------+------------+
| date       | total_sale |
+------------+------------+
| 2013-10-1  |          0 |
| 2013-10-2  |          0 |
| 2013-10-3  |        798 |
| 2013-10-4  |          0 |
| 2013-10-5  |          0 |
| 2013-10-6  |        114 |
+------------+------------+

对于每月,我得到的是这样的:

代码语言:javascript
复制
mysql> select c_date, month(c_date) as month, year(c_date) as year, sum(total) as total from sale group by c_date order by c_date;
+---------------------+-------+------+-------+
| c_date              | month | year | total |
+---------------------+-------+------+-------+
| 2013-10-3 02:40:06  |    10 | 2013 |   228 |
| 2013-10-3 02:41:58  |    10 | 2013 |   114 |
| 2013-10-3 02:44:36  |    10 | 2013 |   114 |
| 2013-10-3 02:46:40  |    10 | 2013 |   114 |
| 2013-10-3 02:49:15  |    10 | 2013 |   114 |
| 2013-10-3 02:53:36  |    10 | 2013 |   114 |
| 2013-10-6 07:43:27  |    10 | 2013 |   114 |
+---------------------+-------+------+-------+

但我想要这样的东西:

代码语言:javascript
复制
mysql> select c_date, month(c_date) as month, year(c_date) as year, sum(total) as total from sale group by c_date order by c_date;
+---------------------+-------+------+-------+
| c_date              | month | year | total |
+---------------------+-------+------+-------+
| 2013-1-3 02:40:06   |     1 | 2013 |     0 |
| 2013-2-3 02:41:58   |     2 | 2013 |     0 |
| 2013-3-3 02:44:36   |     3 | 2013 |     0 |
| 2013-4-3 02:46:40   |     4 | 2013 |     0 |
| 2013-5-3 02:49:15   |     5 | 2013 |     0 |
| 2013-6-3 02:53:36   |     6 | 2013 |     0 |
| 2013-7-6 07:43:27   |     7 | 2013 |     0 |
| 2013-8-3 02:44:36   |     8 | 2013 |     0 |
| 2013-9-3 02:46:40   |     9 | 2013 |     0 |
| 2013-10-3 02:49:15  |    10 | 2013 |   912 |
| 2013-11-3 02:53:36  |    11 | 2013 |     0 |
| 2013-12-6 07:43:27  |    12 | 2013 |     0 |
+---------------------+-------+------+-------+

使用MysqL可以做到这一点吗?

EN

回答 2

Stack Overflow用户

发布于 2013-10-21 20:32:46

由于不可能在MySQL中使用序列(实际上,它们根本不存在),因此必须首先创建日期范围表。这将是这样的:

代码语言:javascript
复制
CREATE TABLE dates_range (record_date DATE)

然后用sale表中存在的日期填充此表,从日期中的最小值开始,直到最大值。

在此之后,使用SQL LEFT JOIN操作符,您将能够像这样聚合数据:

代码语言:javascript
复制
SELECT
  YEAR(dates_range.record_date),
  MONTH(dates_range.record_date),
  DAY(dates_range.record_date),
  COALESCE(SUM(sale.total), 0) AS total_sum
FROM
  dates_range
    LEFT JOIN sale
      ON dates_range.record_date=DATE(sale.c_date)
GROUP BY
  YEAR(dates_range.record_date),
  MONTH(dates_range.record_date),
  DAY(dates_range.record_date)
票数 1
EN

Stack Overflow用户

发布于 2013-10-21 20:39:24

在我看来,您需要一个带有日历表的外部连接。

假设有一个日程表,填充如下:

日历

代码语言:javascript
复制
Year Month   Day
2013 201310  2013-10-1    
2013 201310  2013-10-2
...

然后,您可以编写一个查询,如

代码语言:javascript
复制
         select date(c_day) as date, 
                sum(total) as total_sale 
           from calendar c 
left outer join sale s 
             on c.day = s.c_date
          where c.month = 201310
       group by c_day
         having c_day <= max(s.c_date); -- this is to avoid to show all 
                                        -- days for October
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19494424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档