2016-11-14 3 views
0

Вот мой запросКак найти значение Count MAX для каждой группы отдельно

SELECT q2.item_code 
    , q2.SELL_DELIVERY_AMOUNT 
    , q2.count_amount 
    FROM 
    (SELECT i.item_code 
      , s.SELL_DELIVERY_AMOUNT 
      , count(s.SELL_DELIVERY_AMOUNT) count_amount 
     FROM sell_delivery_items s 
      , items i 
     WHERE s.item_id = i.item_id 
     GROUP 
      BY SELL_DELIVERY_AMOUNT 
      , item_code 
    ) q2 
order 
    by item_code 
    , count_amount desc 

и результат

item_code SELL_DELIVERY_AMOUNT  count_amount 
0001  50      2 
0001  100      1 
0002  150      3 

мне нужно показать только самое count_amount строку для каждой группы ITEM_CODE. Я выполнил поиск по некоторому ответу, но по-прежнему не могу обратиться к моему.

Это результат я хочу

item_code SELL_DELIVERY_AMOUNT  count_amount 
0001  50      2 
0002  150      3 

Как я могу это сделать? спасибо вам за ответ.

+0

Это наиболее часто задаваемый вопрос в теге mysql. Иногда также правильно ответили - и в руководстве содержится целая страница. Но если вы действительно боретесь, см. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a -very-simple-sql-query – Strawberry

ответ

0

Это непроверенный, как у меня нет MySQL - но что-то, как это должно работать:

SELECT q2.item_code, q2.SELL_DELIVERY_AMOUNT, q2.count_amount 
FROM 
(SELECT i.item_code, s.SELL_DELIVERY_AMOUNT , count(s.SELL_DELIVERY_AMOUNT)  as count_amount 
FROM sell_delivery_items s , items i, @rownum := @rownum + 1 AS rank 
WHERE s.item_id = i.item_id 
GROUP BY SELL_DELIVERY_AMOUNT, item_code) as q2 
where rank = 1 
order by item_code, count_amount desc 

Вы должны добавить «ранга» или «номер строки» функциональность внутреннего запроса, а затем добавить отфильтруйте внешний запрос, чтобы выбрать только верхнюю ранжированную строку.

Вот еще один пример ранжирования в MySQL: Ranking by Group in MySQL

+0

Я переместил «rownum» во внутренний SELECT и SET rownum = 0 перед внешним SELECT, но он отобразит только одну строку и неправильный результат. –

+0

вам нужно сделать «rownum», который сбрасывается с вашей GROUP BY - проверьте ссылку (http://stackoverflow.com/questions/18361364/ranking-by-group-in-mysql), она объясняет, как это сделать – tember

0

Что об этом?

SELECT q2.item_code, q2.SELL_DELIVERY_AMOUNT, max(q2.count_amount) 
FROM 
(SELECT i.item_code, s.SELL_DELIVERY_AMOUNT , count(s.SELL_DELIVERY_AMOUNT) as count_amount 
FROM sell_delivery_items s , items i 
WHERE s.item_id = i.item_id 
GROUP BY SELL_DELIVERY_AMOUNT, item_code) as q2 
group by q2.item_code 
order by count_amount desc 

В здесь order by item_code, count_amount desc вы заказываете item_code по естественному порядку, а < г, так что это не нужно, как это предписывалось в group by.

+0

Я попробовал это, и он покажет только первую строку первой группы. –

+0

Правда. Позвольте мне подумать ... –

+0

SELL_DELIVERY_AMOUNT все еще показывает неправильное значение, но остальное право. –

0

У меня есть решение. Вот мой:

SELECT q3.item_code, q3.item_name, substring_index(q3.AMOUNT_LIST, ',' , 1) as most_amount_count, 
substring_index(q3.count_list,',',1) as count_time from 

(SELECT q2.item_code, q2.item_name, GROUP_CONCAT(SELL_DELIVERY_AMOUNT ORDER BY q2.count_amount DESC) as AMOUNT_LIST, 
GROUP_CONCAT(q2.count_amount ORDER BY q2.count_amount desc) as count_list from 

    (SELECT i.item_code, i.ITEM_NAME, s.SELL_DELIVERY_AMOUNT , count(s.SELL_DELIVERY_AMOUNT) as count_amount 
    FROM sell_delivery_items s , items i 
    WHERE s.item_id = i.item_id 
    GROUP BY SELL_DELIVERY_AMOUNT, item_code 
    order by item_code, count_amount desc 
    ) as q2 

group by q2.item_code)as q3 
Смежные вопросы