Я вижу, как это может быть проблемой, если вы хотите ORDER BY переменные, которые вы не хотите, чтобы GROUP BY. Если не включить некоторые переменные в оператор GROUP BY, эти столбцы будут удалены из результирующей таблицы, и, следовательно, вы не сможете упорядочить их по ним.
В вашем примере вы можете показать, сколько раз данный покемон имел определенный статус, например:
SELECT
p.name
,d.status
,count(*) tally
FROM pokemon p
INNER JOIN pokedex d on p.name=d.id
GROUP BY
p.name
,d.status
Невозможно упорядочить приведенный выше результат запроса по возрасту, так как вы не указали имя, статус GROUP * и age.
В этом примере я бы сделал:
SELECT
p.age
,p.name
,d.status
,count(*) tally
FROM pokemon p
INNER JOIN pokedex d on p.name=d.id
GROUP BY
p.age
,p.name
,d.status
Однако , и, на ваш взгляд, не всегда возможно включить в предложение group by те столбцы, по которым вы хотите упорядочить данные. Итак, взяв в качестве примера данные / таблицы ваших покемонов, позвольте мне проиллюстрировать общий подход, который может оказаться полезным:
1) Сначала я создал бы таблицу со своим заказом:
SELECT
*
,ROW_NUMBER() as my_order
FROM (
SELECT
age
,name
FROM pokemon
ORDER BY
age
,name
)
2) Затем я присоединю его к остальной части моей сгруппированной таблицы, упорядочив по пользовательскому столбцу «my_order», который я создал для этой цели:
SELECT
a.*
,custom.my_order
FROM a -- I'm calling 'a' your table, after your joins/group bys
INNER JOIN (
SELECT
name
,ROW_NUMBER() as my_order
FROM (
SELECT
age
,name
FROM pokemon
ORDER BY
age
,name
)
) AS custom ON a.name=custom.name
ORDER BY custom.my_order
Это моя версия «группировки после выполнения заказа» , хотя я не думаю об этом в этих терминах - я думаю о ней как о «заказном» заказе.