总结多个报告

时间:2016-07-02 02:37:24

标签: mysql

我有一个查询...

SELECT `fac` SUM(`a`),SUM(`b`),SUM(`c`),SUM(`d`)   
FROM `x` WHERE `dateTime` BETWEEN '2016-06-13 'AND '2016-06-14' AND `fac` = 1

...输出:

|fac|sumA|sumB|sumC|sumD|  
+---+----+----+----+----+  
|  1|x   |    |    |    |

但是我试图将查询循环输出fac五次:

|fac|sumA|sumB|sumC|sumD|  
+---+----+----+----+----+  
|  1|x   |    |    |    |  
+---+----+----+----+----+  
|  2|x   |    |    |    |  
+---+----+----+----+----+  
|  3|x   |    |    |    |  
+---+----+----+----+----+  
|  4|x   |    |    |    |  
+---+----+----+----+----+  
|  5|x   |    |    |    |

3 个答案:

答案 0 :(得分:0)

尝试将查询循环到输出4。

希望这会有所帮助,投票!

答案 1 :(得分:0)

SELECT `fac`
     , SUM(`a`)
     , SUM(`b`)
     , SUM(`c`)
     , SUM(`d`)   
  FROM `x`
 WHERE `dateTime` BETWEEN '2016-06-13' AND '2016-06-14'
   AND `fac` IN (1,2,3,4,5)
 GROUP BY `fac`
 ORDER BY `fac`

如果给定的fac没有满足dateTime条件的行,那么fac就不会有一行。也就是说,您无法保证此查询将返回五行;就像你的原始查询不能保证返回一行。

对于dateTime上的BETWEEN范围,这将包括2016-06-14午夜的行。

如果您执行BETWEEN '2016-06-14' AND ...

,则会包含相同的行

使用日期时间范围,为了从一天获取行,我们通常会执行> =和<范围。

WHERE `datetime` >= '2016-06-13'
  AND `datetime` <  '2016-06-14'

如果您希望始终返回五行,当fac没有任何行时使用零,则需要五个fac值的保证行来源。像这样:

SELECT i.`fac`
     , IFNULL(SUM(t.`a`),0)
     , IFNULL(SUM(t.`b`),0)
     , IFNULL(SUM(t.`c`),0)
     , IFNULL(SUM(t.`d`),0)   
  FROM ( SELECT 1 AS `fac`
         UNION ALL SELECT 2
         UNION ALL SELECT 3
         UNION ALL SELECT 4
         UNION ALL SELECT 4
         UNION ALL SELECT 5
       ) i
  LEFT
  JOIN `x` t
    ON t.`fac` = i.`fac`
   AND t.`dateTime` >= '2016-06-13' 
   AND t.`dateTime` <  '2016-06-14'
   AND t.`fac` IN (1,2,3,4,5)
 GROUP BY i.`fac`
 ORDER BY i.`fac`

答案 2 :(得分:0)

您只需要group by并删除facselect上的条件:

SELECT `fac`, SUM(`a`), SUM(`b`), SUM(`c`), SUM(`d`)   
FROM `x
WHERE `dateTime` BETWEEN '2016-06-13 'AND '2016-06-14' 
GROUP BY fac;

在大多数数据库中,原始查询会返回错误,因为facSELECT子句中但在GROUP BY中没有,而不是聚合函数的参数。

如果您希望仅将结果限制为5个fac,则可以将and fac in (1, 2, 3, 4, 5)添加到where子句中。