我有一个查询...
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 | | | |
答案 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
并删除fac
中select
上的条件:
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;
在大多数数据库中,原始查询会返回错误,因为fac
在SELECT
子句中但在GROUP BY
中没有,而不是聚合函数的参数。
如果您希望仅将结果限制为5个fac,则可以将and fac in (1, 2, 3, 4, 5)
添加到where
子句中。