我的表格如下所示:
uid added_on rm_id qnty rate
1 2017-10-23 10:48:50 5 2 30
2 2017-10-23 10:48:50 6 4 70
3 2017-10-23 10:48:50 7 5 10
4 2017-10-24 11:02:10 5 10 28
5 2017-10-24 11:02:10 6 2 75
6 2017-10-24 11:03:37 7 1 15
7 2017-10-25 11:02:10 6 5 65
8 2017-10-25 11:03:37 7 8 12
我需要rm_id
,其quantity
(即rm_id 5为12(2 + 10)),最后添加rate
(最新费率可以从最新添加的_找到)速率或每个rm_id的最后一个uid)。结果应该如下所示:
结果
rm_id total_qnty rate
5 12 28
6 11 65
7 14 12
我尝试使用
实现这一目标SELECT `rm_id`, sum(`qnty`),`rate` FROM `stock` group by `rm_id` having max(`uid`)
和
SELECT `rm_id`, sum(`qnty`),`rate` FROM `stock` group by `rm_id` having max(date(`added_on`))
但是没有得到所需的结果..请帮助我..
答案 0 :(得分:1)
having max(uid)
转换为having 8
rm_id = 7
。 MySQL处理数字> 0为真,所以这变为having true
,即不以任何方式限制我的结果。无论如何,汇总结果都不包含单一费率,因此尝试通过HAVING
获取结果为时已晚。您需要一个聚合函数,例如Oracle的KEEP LAST
,但MySQL没有这个功能。
您想要的是获得最大值uid
并在其帮助下选择相关记录:
select
stock.rm_id,
stockagg.sum_qnty,
stock.rate as last_rate
from
(
select
rm_id,
sum(qnty) as sum_qnty,
max(uid) as max_uid
from stock
group by rm_id
) stockagg
join stock on stock.uid = stockagg.max_uid;
答案 1 :(得分:1)
您需要找到最大日期,并从中确定费率,并将该费率应用于总计数量。
select
t.rm_id, t.rate, gd.sum_qty, gd.sum_qty * t.rate
from table1 t
inner join (
select rm_id, max(added_on) max_date, sum(qnty) sum_qty
from table1
group by rm_id
) gd on t.rm_id = gd.rm_id and t.added_on = gd.max_date
数据模型很奇怪,为什么不分开费率?
答案 2 :(得分:0)
您可以使用子查询:
SELECT `rm_id`, sum(`qnty`),
(SELECT `rate`
FROM `stock` s1
WHERE `uid` = (SELECT `uid`
FROM `stock` s2
WHERE s2.`rm_id` = s1.`rm_id`
ORDER BY `added_on` DESC
LIMIT 1)
) AS `rate`
FROM `stock`
GROUP BY `rm_id`