MySQL Группировка по агрегатным функциям - PullRequest
1 голос
/ 19 февраля 2020

Извините, если я звучу совершенно ново ie, но я знаю, что в одном шаге от решения этой проблемы. Есть ли способ, которым я могу GROUP BY number_of_trans? я хотел бы знать , сколько пользователей имеют одинаковое количество транзакций, сгруппированных по количеству транзакций . мой запрос выглядит так:

SELECT
  cust_id, COUNT(*) AS number_of_trans
FROM
  table
GROUP BY
  cust_id
HAVING COUNT(*) > 1
ORDER BY
  number_of_trans

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

+------------------+--------------+
| cust_id          | numb_of_trans|
+------------------+--------------+
| 01               |  2           |
| 02               |  3           |
| 03               |  3           |
| 04               |  4           |
| 05               |  4           |
+------------------+--------------+

, в то время как я ожидаю такой результат:

+------------------+--------------+
| numb_of_trans    | count        |
+------------------+--------------+
| 1                |  null        |
| 2                |  1           |
| 3                |  2           |
| 4                |  2           |
| 5                |  null        |
+------------------+--------------+

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Можете ли вы попробовать ниже заявление.

SELECT
number_of_trans, count(number_of_trans) as count FROM table GROUP BY number_of_trans ORDER BY number_of_trans. 
0 голосов
/ 19 февраля 2020

Вы можете left join свой текущий агрегированный запрос со списком чисел и еще раз агрегировать:

select 
    n.number_of_trans,
    count(*) cnt
from (
    select 1 number_of_trans
    union all select 2
    union all select 3
    union all select 4
    union all select 5
) n
left join (
    select count(*) as number_of_trans
    from mytable
    group by cust_id
    -- having count(*) > 1
) t on t.number_of_trans = n.number_of_trans
group by n.number_of_trans
order by n.number_of_trans

При необходимости вы можете расширить подзапрос union all, добавив больше чисел.

Я не уверен, что вам нужен пункт having в совокупном запросе, который отфильтровывает cust_id s, которые имеют только одну запись, поэтому я прокомментировал это - не стесняйтесь раскомментировать его при необходимости.

Также обратите внимание, что это даст 0 вместо null для number_of_trans, которых нет в агрегированном подзапросе. Если вы действительно хотите null, то вы можете сделать:

nullif(count(*), 0) cnt
...