Выберите последнюю цену в соответствии с датой, используя GROUP BY

0

Я пытаюсь сделать запрос с группой 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-by

5 ответов

1
Лучший ответ

Вы можете сделать это с помощью 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 на строку.
  • 0
    Еще лучше и намного оптимизированнее, спасибо!
2

Возможно, вам понадобится дополнительный запрос, попробуйте ниже:

   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;
  • 0
    кажется, это самое простое решение, я буду использовать это большое спасибо!
0

Вы можете сделать это следующим образом:

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
0

Вы можете выбрать все строки из билета, сгруппированные по идентификатору (суммировать количество), а затем присоединиться к строкам, которые имеют максимальный 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; 
0

Попробуйте этот запрос.

SELECT id, Price, sum(Qt) FROM ticket
GROUP BY id,Price

Ваш результат;

id       Price       sum(Qt)
1        3.00        4
2        8.00        7
  • 0
    Привет, спасибо за ваш ответ! Я уже думал об этом, но, к сожалению, результат не правильный, у меня есть все цены для каждого идентификатора ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню