Как сортировать значения в столбце на основе идентификаторов в другом столбце в sql

#sql #postgresql

#sql #postgresql

Вопрос:

Это было бы нашим вкладом:

Имя год ценности
A 2001 10
A 2000 5
A весь 15
B 2010 3
B 2011 7
B весь 10

Мы должны отсортировать эту таблицу по возрастанию значений «ИТОГО», а затем по возрастанию значений ГОДА в пределах одного и того же ИМЕНИ.

Это было бы нашим результатом:

Имя год ценности
B 2010 3
B 2011 7
B весь 10
A 2000 5
A 2001 10
A весь 15

Ответ №1:

Я думаю, что я бы суммировал все значения, разделенные по имени, в CTE, отсортировал по ним, затем по имени, затем по году (с особым случаем для итога)

 WITH cte AS (  SELECT *, SUM(values) OVER(PARTITION BY name) as sumval  FROM yourdata )  SELECT name, year, values FROM cte ORDER BY sumval, name, CASE WHEN year = 'TOTAL' THEN '9999' ELSE year end  

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

 SELECT yourdata.* FROM  yourdata  INNER JOIN (SELECT name, values FROM yourdata WHERE year = 'TOTAL') t  ON t.name = yourdata.name ORDER BY  t.values, yourdata.name, CASE WHEN year = 'TOTAL' THEN '9999' ELSE year end  

напр.

 B 2010 3 TOTAL 10 B 2011 7 TOTAL 10 B TOTAL 10 TOTAL 10 A 2000 5 TOTAL 15 A 2001 10 TOTAL 10 A TOTAL 15 TOTAL 10  

Последний столбец-это итоговая строка для имени, повторяющегося снова и снова, поэтому вы можете сортировать по итогу, затем по имени, чтобы разорвать связи, затем по годам (с 9999, чтобы поместить итог после числовых лет).