我有表products
(id
,name
,price
,...)和productStats
(productId
,{{1 }},time
,unitsSold
,...)。
在unitsReserved
中,我们每分钟都有一行,以及该特定分钟的所有必要汇总值。如果我们需要获得一个时期的统计数据,那就可以了:
productStats
但是当我们想要同时获取多个时段的聚合值时,我们遇到了错误(错误的值):
select
id,
name,
SUM(lastDay.unitsSold) as latDayUnitsSold,
from `products`
left join
`productStats` as `lastDay`
on `products`.`id` = `lastDay`.`productId`
and `lastDay`.`time` between '2018-05-27 00:00:00' and '2018-05-28 00:00:00'
group by `products`.`id`
我们如何多次加入同一个表,但具有不同的日期时间范围,并且每个表都有单独的总和列?
答案 0 :(得分:0)
尝试使用OR
select
id,
name,
SUM(lastDay.unitsSold) as latDayUnitsSold,
SUM(lastMonth.unitsSold) as latMonthUnitsSold,
SUM(lastYear.unitsSold) as latYearUnitsSold,
from `products`
left join
`productStats` as `lastDay`
on `products`.`id` = `lastDay`.`productId`
and
(
`lastDay`.`time` between '2018-05-27 00:00:00' and '2018-05-28 00:00:00'
OR
`lastDay`.`time` between '2018-04-28 00:00:00' and '2018-05-28 00:00:00'
OR
`lastDay`.`time` between '2017-05-28 00:00:00' and '2018-05-28 00:00:00'
)
group by `products`.`id`
答案 1 :(得分:0)
您可以使用单个连接操作
在不同的时间范围内使用条件聚合SELECT
p.id,
p.name,
SUM(CASE WHEN `lastDay`.`time` BETWEEN '2018-05-27 00:00:00' AND '2018-05-28 00:00:00' THEN lastDay.unitsSold ELSE 0 END) AS latDayUnitsSold,
SUM(CASE WHEN `lastDay`.`time` BETWEEN '2018-04-28 00:00:00' AND '2018-05-28 00:00:00' THEN lastDay.unitsSold ELSE 0 END) AS latMonthUnitsSold,
SUM(lastDay.unitsSold) AS latYearUnitsSold,
FROM `products` p
LEFT JOIN
`productStats` AS `lastDay`
ON p.`id` = `lastDay`.`productId`
AND `lastDay`.`time` BETWEEN '2017-05-28 00:00:00' AND '2018-05-28 00:00:00'
GROUP BY p.id, p.name