设为首页收藏本站

融智技术学院

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 872|回复: 0

【MariaDB每日一问】在MySQL(MariaDB)中使用(GROUP BY日期)求得列的总和

[复制链接]
MrLi 发表于 2013-10-10 17:28:16 | 显示全部楼层 |阅读模式
在MySQL(MariaDB)中使用(GROUP BY日期)求得列的总和
问:这是一个示例,我的数据库(庞大的数据库,一个表)。我使用MariaDB的。
  1. DATE        |   SIZE        |   FILES
  2. 2013-01-06  |   1600        |   30
  3. 2013-01-06  |   3200        |   14
  4. 2013-02-14  |   1600        |   3
  5. 2013-02-14  |   800         |   4
  6. 2013-05-19  |   6400        |   300
  7. 2013-05-19  |   9000000     |   15000
复制代码
我试图求得SIZE列的总和和FILES列的总和,根据日期列分组。例如,对于2013年1月6日,SIZE列为4800和FILES列将是44,依此类推。我尝试的查询语句是:
  1. SELECT DATE, SUM(SIZE) AS BYTES, SUM(FILES) AS FILES
  2. FROM DB.DBSA
  3. WHERE (DATE BETWEEN '2013-01-06' AND '2013-05-19');
复制代码
但是查询结果是总计和。
答:
查询引擎识别这个查询作为聚合查询:
  1. SELECT DATE, SUM(SIZE) AS BYTES, SUM(FILES) AS FILES
  2. FROM DB.DBSA
  3. WHERE (DATE BETWEEN '2013-01-06' AND '2013-05-19');
复制代码
然而,这里面是没有group by 子句,所以聚合查询时将所有数据处理,(当然是根据where子句中条件的过滤)。

在大多数数据库中,这将导致一个错误,类似“ 没有将日期作为一个组变量“。MySQL选择一个任意的日期值(默认情况下,你可以设定一个参数,在标准的SQL,它产生一个错误)。

您需要使用分组group by:
  1. SELECT DATE, SUM(SIZE) AS BYTES, SUM(FILES) AS FILES
  2. FROM DB.DBSA
  3. WHERE (DATE BETWEEN '2013-01-06' AND '2013-05-19')
  4. group by date;
复制代码
另一方面。列名date的设置是一个不好的名字,因为它与函数名和一个内置的数据类型的冲突。尽量保持你的名字与内置的SQL名称不同。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

新突破电商

小黑屋|手机版|Archiver|融智技术学院 ( 京ICP备09018999号  

GMT+8, 2018-8-18 05:08

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表