ПОРЯДОК ПО агрегированному столбцу в построителе отчетов 3.0

#sql #sql-server

#sql #sql-сервер

Вопрос:

В построителе отчетов 3.0 я восстановил некоторые элементы и подсчитал их, используя агрегат Count. Теперь я хочу упорядочить их от самого высокого к самому низкому. Как мне использовать функцию ORDER BY для агрегированного столбца? На рисунке ниже показан столбец, который я хочу УПОРЯДОЧИТЬ ПО нему, он отмечен.

Рис

Код очень прост, как показано ниже:

 SELECT DISTINCT act_id,NameOfAct,
FROM Acts
  

Комментарии:

1. можете ли вы предоставить какой-либо запрос, который вы пробовали до сих пор?

2. обновите свой вопрос и добавьте код запроса..

3. я так и сделал, пожалуйста, проверьте

Ответ №1:

На вашем рисунке указано, что вам также нужна Total строка внизу:

 SELECT
  COALESCE(NameOfAct,'Total') NameOfAct,
  COUNT(DISTINCT act_id) c
FROM Acts
GROUP BY ROLLUP(NameOfAct)
ORDER BY
    CASE WHEN NameOfAct is null THEN 1 ELSE 0 END,
    c DESC;
  

Результат примера данных:

 NameOfAct   count
--------------  -------
Act_B           3
Act_A           2
Act_Z           1
Total           6
  

Попробуйте это с примерами строк по адресу:http://sqlfiddle.com /#!18/dbd6c/2

Комментарии:

1. ДА. Сводный файл отлично подходит, если вы также хотите получить полную сумму в результатах запроса. Однако я не включил это в свой ответ, потому что я не был уверен, что его механизм составления отчетов уже рассчитает полную сумму. (В этом случае отчет Rabelani Netshifhire может показать общую сумму, которая в два раза превышает фактическую общую сумму, поскольку предполагается, что действие «Total» используется огромное количество раз …)

Ответ №2:

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

Возможно, вам захочется сгруппировать результаты по имени:

 GROUP BY NameOfAct
  

И включите имена действий и их количество в результаты запроса:

 SELECT NameOfAct, COUNT(*) AS ActCount
  

(Поскольку столбец act_id не включен в группы, вам нужно опустить его при ВЫБОРЕ. РАЗЛИЧАТЬ также больше не нужно, поскольку все группы уже уникальны.)

Наконец, вы можете отсортировать данные (возможно, по убыванию, чтобы получить действия с наибольшим количеством сверху):

 ORDER BY ActCount DESC
  

Ваш полный запрос стал бы чем-то вроде этого:

 SELECT NameOfAct, COUNT(*) AS ActCount
FROM Acts
GROUP BY NameOfAct
ORDER BY ActCount DESC
  

Редактировать:

Кстати, вы используете поле «act_id» в вашем предложении SELECT. Это несколько сбивает с толку. Если вы хотите узнать количество, вы хотите просмотреть либо полные данные таблицы, либо сгруппировать данные таблицы в более мелкие группы (с предложением GROUP BY). Затем вы можете использовать агрегированные функции для получения дополнительной информации об этих группах (или всей таблице), такой как количество, средние значения, минимумы, максимумы…

Информация об одной записи, такая как идентификатор действия в вашем случае, обычно не важна, если вы хотите использовать статистические / агрегированные методы для сгруппированных данных. Предположим, ваш запрос возвращает название действия, которое используется 10 раз. Тогда в вашей таблице будет 10 записей, каждая с уникальным act_id, но с одинаковым именем.

Если вам нужен только один act_id, который представляет имя каждой группы / действия (и предполагается, что act_id является полем автоматической нумерации), вы можете включить последнее / наибольшее значение act_id в запрос, используя агрегатную функцию MAX:

 SELECT NameOfAct, COUNT(*) AS ActCount, MAX(act_id) AS LatestActId
  

(Остальная часть запроса остается неизменной.)