2015-05-05 2 views
0

У меня есть следующий sql-оператор, который работает, но я хочу сгруппировать результаты с помощью YEAR (updated_at), MONTH (updated_at) и дать мне общее количество по месяцам года. То, что это должно сделать, это найти мне все результаты, где order_id существует более одного раза, а затем делать общее количество за каждый месяц года. Я думаю, что мне нужно будет сделать подзапрос, но все, что я пробовал, вызывает ошибку.SQL group by id затем группирует результаты по дате

SELECT `order_id` , `updated_at` , COUNT(*) AS grand_total1 
       FROM mg_sales_flat_shipment_track 
       GROUP BY `order_id` 
       HAVING COUNT(*) >1 
       ORDER BY updated_at DESC 

Набор данных:

entity_id parent_id order_id track_number title carrier_code created_at   updated_at 
    31468  33349 36055 31237970006263 UK Mail trackerl  2015-05-01 19:30:52 2015-05-01 19:30:52 
    31453  33348 36054 31237970006264 UK Mail trackerl  2015-05-01 19:30:49 2015-05-01 19:30:49 
    31414  33347 36052 31237970006273 UK Mail trackerl  2015-05-01 19:30:20 2015-05-01 19:30:20 
    31469  33346 36050 31237970006265 UK Mail trackerl  2015-05-01 19:30:52 2015-05-01 19:30:52 
    31461  33345 36049 31237970006266 UK Mail trackerl  2015-05-01 19:30:47 2015-05-01 19:30:47 
    31406  33344 36048 31237970006267 UK Mail trackerl  2015-05-01 19:30:14 2015-05-01 19:30:14 
    31404  33343 36047 31237970006268 UK Mail trackerl  2015-05-01 19:30:13 2015-05-01 19:30:13 
    31407  33342 36046 31237970006269 UK Mail trackerl  2015-05-01 19:30:15 2015-05-01 19:30:15 
    31462  33341 36045 31237970006270 UK Mail trackerl  2015-05-01 19:30:48 2015-05-01 19:30:48 
    31405  33340 36044 31237970006271 UK Mail trackerl  2015-05-01 19:30:14 2015-05-01 19:30:14 
    31383  33153 35837 31237970006197 UK Mail tracker1  2015-04-30 20:00:43 2015-04-30 20:00:43 
    31252  33153 35837 31237970006051 UK Mail tracker1  2015-04-29 20:00:25 2015-04-30 20:00:43 
+0

Я думаю, вам, возможно, придется использовать select month (updated_at) как month, year (updated_at) как год, а затем сказать GROUP By order_id, месяц –

+0

Не могли бы вы рассказать мне, какие ошибки вы получили, чтобы я мог помочь вам более конкретно? –

+1

Спасибо за отчет о состоянии. У вас есть * вопрос *? ПРИМЕЧАНИЕ. В показанном запросе значение, возвращаемое для столбца 'updated_at', * не * детерминировано. (Другие базы данных будут вызывать ошибку с этим SQL, и мы могли бы заставить MySQL также выставить ошибку, если мы установим 'sql_mode' для включения' ONLY_FULL_GROUP_BY'.) Показывая * пример * соответствующих значений столбца из таблицы и показывая * пример * ожидаемого набора результатов, предоставит более четкую спецификацию. Было бы еще лучше, если бы вы установили [SQL Fiddle] (http://sqlfiddle.com). – spencer7593

ответ

0

Ваш запрос как он стоит предоставит вам ненадежных результатов, поскольку updated_at не входит в предложении group by, и он не используется в агрегатной функции.

Если то, что вы хотите, чтобы все order_ids с более чем одной записи, получить количество в месяц в год, то это будет выглядеть примерно так:

select year(updated_at) y, month(updated_at) m, count(*) from 
( SELECT `order_id` , COUNT(*) AS grand_total 
       FROM mg_sales_flat_shipment_track 
       GROUP BY `order_id` 
       HAVING COUNT(*) >1 
) q1 
inner join mg_sales_flat_shipment_track t 
    on q1.order_id = t.order_id 
group by year(updated_at), month(updated_at) 
order by year(updated_at) desc, month(updated_at) desc; 

Для того, чтобы получить любую дополнительную помощь, вам нужно будет указать определение таблицы, некоторые данные образца и результаты, которые вы пытаетесь извлечь.

fiddle here

+0

Я добавил изображение, показывающее структуру таблицы. Я не думаю, что что-то правильно скомпоновано, возможно ли, что его подсчет всего дважды? –

+0

@WillWright Я не вижу дублированных 'order_ids' в этих данных, что означает, что этот запрос никогда не должен возвращать никаких результатов. Что вы имели в виду под 'order_id' существует более одного раза? –

+0

извините, что я показал только фрагмент таблицы 31192 строк –

0

Я думаю, что вы просите это ResultSet как один возвращенного запроса, как это:

SELECT o.order_id 
    , DATE_FORMAT(o.updated_at,'%Y-%m') AS `yyyymm` 
    , COUNT(1)       AS `cnt` 
    FROM (SELECT d.order_id 
      FROM mg_sales_flat_shipment_track d 
      GROUP BY d.order_id 
      HAVING COUNT(1) > 1 
     ) c 
    JOIN mg_sales_flat_shipment_track o 
    ON o.order_id = c.order_id 
GROUP 
    BY o.order_id 
    , DATE_FORMAT(o.updated_at,'%Y-%m') 

Давайте распаковать, что немного. Встроенный вид c в основном получает список order_id значений, которые появляются более одного раза. Из-за GROUP BY это будет отличный список (одна строка за order_id).

Мы можем присоединиться к строкам из этого встроенного представления (MySQL называет его «производной таблицей») обратно в таблицу, чтобы получить все строки с order_id, которые соответствуют одному в списке. Мы ожидаем, что за каждое значение order_id мы получим как минимум две строки из исходной таблицы.

Мы используем функцию DATE_FORMAT для получения года и месяца. Мы делаем GROUP BY и получаем счет за каждый месяц.


Если вам нужен «итог», мы могли бы включить в представлении инлайн COUNT(), а затем ссылаться на этот столбец в списке выбора внешнего запроса. То, что «общая сумма» order_id будет дублироваться в каждой строке для order_id.

Followup

это не дает мне в общей сложности за каждый месяц

Это не ясно, что вы хотите, чтобы в общей сложности.

Вы можете опустить столбец order_id из списка SELECT и предложения ORDER BY во внешнем запросе. Это даст вам «подсчет» строк по «месяцу», из всех строк, где order_id отображается более чем в одной строке.

SELECT DATE_FORMAT(o.updated_at,'%Y-%m') AS `yyyymm` 
    , COUNT(1)       AS `cnt` 
    FROM (SELECT d.order_id 
      FROM mg_sales_flat_shipment_track d 
      GROUP BY d.order_id 
      HAVING COUNT(1) > 1 
     ) c 
    JOIN mg_sales_flat_shipment_track o 
    ON o.order_id = c.order_id 
GROUP 
    BY DATE_FORMAT(o.updated_at,'%Y-%m') 

На данный момент, я все еще просто догадываюсь, какие результаты вы хотите вернуть.

+0

Я обновил эту скрипку с вашим предложением http://sqlfiddle.com/#!9/449f4/1, это не дает мне всего за каждый месяц? –

+0

@WillWright: Не понятно, что вы хотите суммировать. Вы можете опустить 'order_id' из списка SELECT и GROUP BY. Это даст вам «общее количество» по месяцам. (Это будет * count * строк из таблицы, у которой есть 'order_id', который дублируется (отображается несколько раз) в таблице. – spencer7593

Смежные вопросы