Как сгруппировать запрос после его заказа? - PullRequest
1 голос
/ 08 марта 2011

Я пытаюсь сгруппировать запрос после того, как я заказал его, однако в sql (я использую DB2) мы не можем группировать после выполнения заказа, но если я заказываю после группировки изменений группы. Причина этого заключается в том, что он сгруппирован по нескольким атрибутам, а не только по 1 (мне нужно сгруппировать только по 1 атрибуту, но поскольку мы должны соответствовать оператору выбора, я должен сгруппировать по нескольким атрибутам.

Я пытался создать виртуальную таблицу, используя "with", и пытался упорядочить ее, но DB2 говорит, что я могу только группировать, а не упорядочивать внутри атрибута with

То же самое относится к заявлению from. Я пытался выполнить вложенный запрос внутри атрибута from, который возвращает упорядоченный результат, но DB2 ограничивает нас от упорядочения внутри атрибута from (разрешена только группировка)

Так что я не уверен, как это сделать, как я могу сгруппировать что-то после заказа?

Вот пример таблицы:

покемон:

имя и фамилия возраст
3 пикачу 1
2 выпуклость 3
1 хазар 2
11 пикачу 10

(в таблице покемонов)
идентификатор первичного ключа, имя
ссылки на внешние ключи (имя) pokedex (имя)

pokedex:

Идентификационный статус
Пикачу сумасшедший
хазарский герпес
бульбарный отрыжка

Теперь я пытаюсь перечислить таблицу покемонов: ЗАКАЗАТЬ ПО возрасту, имени
но после этого я хочу, чтобы результат был сгруппирован по их идентификатору, однако я выбираю их идентификатор, имя, возраст и статус, поэтому при группировке я должен сопоставить эти атрибуты:
GROUP BY pokedex.id возрастной статус .....
так что проблема в том, что если я сделаю заказ после группировки, это нарушит группировку pokedex.id, так как она сгруппирована по статусу и другим атрибутам, а также
Просто пример, на самом деле не строящий ничего, связанного с покемоном: P

1 Ответ

1 голос
/ 08 марта 2011

Я вижу, как это может быть проблемой, если вы хотите 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

Это моя версия «группировки после выполнения заказа» , хотя я не думаю об этом в этих терминах - я думаю о ней как о «заказном» заказе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...