Сортировка SQL на основе суммы различных столбцов

#sql #sorting #sum

#sql #сортировка #сумма

Вопрос:

У меня есть таблица результатов игры на MS-SQL, которая содержит команду хозяев, счет команды хозяев, счет команды гостей и счет команды гостей. Я пытаюсь запросить команды, победы и проигрыши, упорядоченные сначала по общему количеству побед (по убыванию), а затем по общему количеству потерь (по возрастанию). Таблица не содержит столбец выигрышей или проигрышей. Выигрыши и проигрыши должны рассчитываться на основе очков. Если мне нужно создать представление или временную таблицу, как мне создать это представление с командами, победами и поражениями?

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

1. чтобы уточнить, выигрыши и проигрыши не являются столбцами в таблице. Они должны быть рассчитаны на основе результатов хозяев и гостей

2. затем вам нужно опубликовать структуру вашей таблицы и некоторые примеры данных!

3. Моим личным предпочтением, вероятно, было бы создать представление, которое дает вам сводку побед / поражений за текущий сезон, и запустить ваш запрос в этом представлении.

Ответ №1:

 SELECT *
FROM MyTable
WHERE ...
ORDER BY SUM(win) DESC, SUM(loss) ASC
  

Для более подробного ответа предоставьте свою схему и образцы данных.

Ответ №2:

Предполагая, что вы можете извлечь эту информацию из своего запроса, вы можете использовать агрегаты в ORDER BY предложениях:

 ORDER BY
    SUM(win) DESC
   ,SUM(loss) ASC
  

редактировать: обновить для комментариев

Поскольку сохраняются только результаты, вам захочется либо использовать временную таблицу, либо CTE (зависит от используемой вами СУБД, если она их поддерживает), чтобы сначала создать таблицу, в которой указаны команды, их победы и проигрыши, а затем вы можете SELECT использовать это и ORDER соответственно.

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

1. выигрыши и проигрыши — это не столбцы в моей таблице, скорее таблица содержит окончательный счет игры

2. Каким будет синтаксис для создания таблицы с командами, победами и поражениями?

3. @mp42871 это зависит от того, какую базу данных вы используете — если вы отредактируете свой вопрос более подробно, пользователи смогут обновить свои ответы

4. Я использую Microsoft SQL Server 2008

Ответ №3:

Домашнее задание?

В любом случае, вы можете указать порядок сортировки в инструкции SQL, следуя столбцу с порядком. Например,

 select x, y, z from table order by x asc, y desc, z asc
  

Ответ №4:

 select 
    teamName, 
    'wins' = 
        case 
            when wins is null then 0 
            else wins 
        end, 
    'losses' = 
        case 
            when losses is null then 0 
            else losses 
        end 
from 
    teams 
left join 
( 
    select 
        a.wins as wins, 
        b.losses as losses, 
        'team' = 
            case 
                when a.team is null then b.team 
                else a.team 
            end 
    from 
    ( 
        select 
            homeTeam as team, 
            sum(wins) as wins 
        from 
        ( 
            select 
                homeTeam, 
                count(*) as wins 
            from 
                results 
            where 
                homeScore > awayScore 
            group by 
                homeTeam 
            union all 
            select 
                awayTeam, 
                count(*) as wins 
            from 
                results 
            where 
                homeScore < awayScore 
            group by 
                awayTeam         
        ) a 
        group by homeTeam 
    ) a 
    full outer join 
    ( 
        select 
            homeTeam as team, 
            sum(losses) as losses 
        from 
        ( 
            select 
                homeTeam, 
                count(*) as losses 
            from 
                results 
            where 
                homeScore < awayScore 
            group by 
                homeTeam 
            union all 
            select 
                awayTeam, 
                count(*) as losses 
            from 
                results 
            where 
                homeScore > awayScore 
            group by 
                awayTeam 
        ) a 
        group by 
            homeTeam 
    ) b 
    on a.team = b.team 
) c 
on teams.id = c.team