当列名与SQL相同时,如何分组和求和?

时间:2019-02-06 12:12:12

标签: mysql sql

这是我的表列名称:

id_x | id_y | ts | data_a | data_b | data_c

我正在运行以下查询:

SELECT ts, data_a, data_b, data_c from table 
WHERE id_x=4392 
AND id_y IN (2545,2614,3349,4430) 
AND ts BETWEEN '2017-02-01' AND '2017-03-01' 

我得到的结果如下:

2017-02-01 | 4   | 4  | 0
2017-02-01 | 140 | 30 | 29
2017-02-02 | 4   | 4  | 0
2017-02-02 | 289 | 63 | 60

ts字段已列出多次。 我更喜欢一次,总结一下单元格内容。
是否可以通过这种方式对ts(时间戳)列进行分组?

想要的结果:

2017-02-01 | 144 | 34  | 29
2017-02-02 | 293 | 67  | 60

2 个答案:

答案 0 :(得分:3)

您需要提取日期并进行汇总:

SELECT DATE(ts) as ts_date, SUM(data_a) as data_a,
       SUM(data_b) as data_b, SUM(data_c) as data_c 
FROM table 
WHERE id_x = 4392 AND 
      id_y IN (2545, 2614, 3349, 4430) AND
      ts >= '2017-02-01' AND
      ts < '2017-03-01'
GROUP BY DATE(ts) ;

注意:

  • 这将从时间戳中提取日期。大概有一个时间成分。
  • GROUP BYSUM()进行您所拥有的处理。
  • WHERE子句中的日期条件已更改,因此您获得了所有2月的值,而没有3月的值。

如果您希望日期范围包含3月1日,请使用:

      ts >= '2017-02-01' AND
      ts < '2017-03-02'

此结构(带有>=<)适用于日期和日期/时间。我强烈建议您不要将BETWEEN与日期/时间数据类型一起使用,因为结果可能会产生误导。

答案 1 :(得分:2)

您需要使用sum()聚合和group by子句

SELECT ts, sum(data_a), sum(data_b), sum(data_c) from table 
WHERE id_x=4392 
AND id_y IN (2545,2614,3349,4430) 
AND ts BETWEEN '2017-02-01' AND '2017-03-01' 
group by ts