代码之家  ›  专栏  ›  技术社区  ›  Imnotapotato

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

  •  2
  • Imnotapotato  · 技术社区  · 7 年前

    这是我的表列名:

    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 回复  |  直到 7 年前
        1
  •  3
  •   Gordon Linoff    7 年前

    您需要提取日期和合计:

    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 BY SUM() 做你想做的事情。
    • 中的日期条件 WHERE 子句已更改,因此您可以获得二月的所有值,而三月的值为零。

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

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

    这个构造——带有 >= < --适用于日期和日期/时间。我强烈建议您不要使用 BETWEEN

        2
  •  2
  •   Fahmi    7 年前

    你需要使用 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