Я пытаюсь сделать запрос с группой BY.
Вот пример моего табличного билета:
id DtSell Price Qt
1 01-01-2017 3.00 1
1 02-01-2017 2.00 3
2 01-01-2017 5.00 5
2 02-01-2017 8.00 2
И моя просьба:
SELECT id, Price, sum(Qt) FROM ticket
GROUP BY id;
но, к сожалению, возвращенная цена не обязательно правильная; Я бы хотел, чтобы последняя цена в соответствии с DtSell была такой:
id Price sum(Qt)
1 2.00 4
2 8.00 7
Но я не нашел, как это сделать. Вы можете мне помочь?
Заранее спасибо!!
Вы можете сделать это с помощью group_concat()
/substring_index()
:
SELECT id, Price, SUM(Qt)
SUBSTRING_INDEX(GROUP_CONCAT(price ORDER BY dtsell DESC), ',' 1) as last_price
FROM ticket
GROUP BY id;
Две заметки:
GROUP_CONAT()
(предел, который можно легко изменить).price
на строку.Возможно, вам понадобится дополнительный запрос, попробуйте ниже:
SELECT
t1.id,
(SELECT t2.price FROM ticket t2 WHERE t2.id=t1.id
ORDER BY t2.DtSell DESC LIMIT 1 ) AS price,
SUM(t1.Qt)
FROM ticket t1 GROUP BY t1.id;
Вы можете сделать это следующим образом:
declare @t table (id int, dtsell date, price numeric(18,2),qt int)
insert into @t
values
(1 ,'01-01-2017', 3.00 , 1),
(1 ,'02-01-2017', 2.00 , 3),
(2 ,'01-01-2017', 5.00 , 5),
(2 ,'02-01-2017', 8.00 , 2)
select x.id,price,z.Qt from (
select id,price,dtsell,row_number() over(partition by id order by dtsell desc ) as rn from @t
)x
inner join (select SUM(qt) as Qt,ID from @t group by id ) z on x.id = z.id
where rn = 1
Вы можете выбрать все строки из билета, сгруппированные по идентификатору (суммировать количество), а затем присоединиться к строкам, которые имеют максимальный dtsell для каждой группы идентификаторов (для выбора цены).
http://sqlfiddle.com/#!9/574cb9/8
SELECT t.id
, t3.price
, SUM(t.Qt)
FROM ticket t
JOIN ( SELECT t1.id
, t1.price
FROM ticket t1
JOIN ( SELECT id
, MAX(dtsell) dtsell
FROM ticket
GROUP BY id ) t2
ON t1.id = t2.id
AND t1.dtsell = t2.dtsell ) t3
ON t3.id = t.id
GROUP BY t.id;
Попробуйте этот запрос.
SELECT id, Price, sum(Qt) FROM ticket
GROUP BY id,Price
Ваш результат;
id Price sum(Qt)
1 3.00 4
2 8.00 7