2016-03-14 6 views

ответ

0

Если вы используете SQL Server/Oracle/Postgresql можно использовать оконный SUM:

SELECT * 
FROM tab 
ORDER BY SUM(col3) OVER(PARTITION BY col) DESC, col2 

LiveDemo

Выход:

╔═════╦══════╦══════╗ 
║ col ║ col2 ║ col3 ║ 
╠═════╬══════╬══════╣ 
║ b ║ 1 ║ 55 ║ 
║ b ║ 2 ║ 44 ║ 
║ b ║ 3 ║ 8 ║ 
║ a ║ 1 ║ 15 ║ 
║ a ║ 2 ║ 3 ║ 
║ a ║ 3 ║ 34 ║ 
╚═════╩══════╩══════╝ 
1

Вы можете сделать это с помощью функции стандартного окна ANSI. Я предпочитаю использовать подзапрос, хотя это не является строго необходимым:

select col1, col2, col3 
from (select t.*, sum(col3) over (partition by col1) as sumcol3 
     from t 
    ) t 
order by sumcol3 desc, col3 desc; 
1

... и пример того, как сделать это без оконных функций, например в MySQL (но и практически в любой другой стандартной версии SQL)

SELECT m.col1, m.col2, m.col3 
FROM myTable m 
JOIN (
    SELECT col1, SUM(col3) groupsum FROM myTable GROUP BY col1 
) z ON m.col1 = z.col1 
ORDER BY z.groupsum DESC, col2; 

В принципе, рассчитать сумму группы в подзапросе и соединить/заказать результаты по сумме суммы группы.

An SQLfiddle to test with.

Смежные вопросы