Сортировать по двум столбцам

У меня есть такая таблица:

+----+------+-----------+-------------------+
| ID | Name | sortorder | overridesortorder |
+----+------+-----------+-------------------+
| 1  | kkkk | 4         | null              |
+----+------+-----------+-------------------+
| 2  | yyyy | 3         | null              |
+----+------+-----------+-------------------+
| 3  | zzzz | 2         | 4                 |
+----+------+-----------+-------------------+
| 4  | gggg | 1         | 3                 |
+----+------+-----------+-------------------+
| 5  | bbbb | null      | null              |
+----+------+-----------+-------------------+
| 6  | aaaa | null      | null              |
+----+------+-----------+-------------------+

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

+----+-------+-----------+-------------------+
| ID | Name  | sortorder | overridesortorder |
+----+-------+-----------+-------------------+
| 1  | kkkk  | **4**     | null              |
+----+-------+-----------+-------------------+
| 3  | zzzz  | 2         | **4**             |
+----+-------+-----------+-------------------+
| 2  | yyyy  | **3**     | null              |
+----+-------+-----------+-------------------+
| 4  | gggg  | 1         | **3**             |
+----+-------+-----------+-------------------+
| 6  | bbbb  | null      | null              |
+----+------+-----------+-------------------+
| 5  | aaaa  | null      | null              |
+----+------+-----------+-------------------+

person user1482489    schedule 19.02.2018    source источник
comment
Ваш ожидаемый результат несовместим. В некоторых случаях вы сортируете по имени по возрастанию, в других — по убыванию.   -  person Tim Biegeleisen    schedule 19.02.2018


Ответы (4)


Кажется, вы ищете это

declare @t table(
    ID int
    , Name varchar(100)
    , sortorder int
    , overridesortorder int
)
insert into @t
values 
    (1, 'kkkk', 4, null)
    , (2, 'yyyy', 3, null)
    , (3, 'zzzz', 2, 4)
    , (4, 'gggg', 1, 3)
    , (5, 'bbbb', null, null)
    , (6, 'aaaa', null, null)

select
    *
from
    @t
order by coalesce(case when isnull(sortorder, 0) > isnull(overridesortorder, 0) then sortorder else overridesortorder end, -2147483648) desc, Id, Name

Выход

ID  Name    sortorder  overridesortorder 
----------------------------------------
1   kkkk    4          NULL
3   zzzz    2          4
2   yyyy    3          NULL
4   gggg    1          3
5   bbbb    NULL       NULL
6   aaaa    NULL       NULL
person uzi    schedule 19.02.2018

Это то, что вы хотите?

select * 
from table
order by coalesce(overridesortorder, sortorder) desc, overridesortorder
person Yogesh Sharma    schedule 19.02.2018

Попробуй это,

SELECT  *
        ,(CASE WHEN ISNULL(sortorder,0) > ISNULL(overridesortorder,0)
          THEN ISNULL(sortorder,0) 
          ELSE ISNULL(overridesortorder,0) END) AS FinalSortOrder
FROM    YourTable
ORDER BY FinalSortOrder DESC
        ,sortorder DESC
        ,overridesortorder DESC
        ,Name DESC

Демо здесь

person Abdul Rasheed    schedule 19.02.2018

Если я правильно понимаю ваш сценарий, столбец overridesortorder просто переопределяет столбец sortorder. Вы можете использовать COALESCE, чтобы вернуть первое ненулевое значение, и это важно, когда оба столбца имеют значение null, чтобы вернуть ноль.

ORDER BY COALESCE(overridesortorder, sortorder, 0) DESC, 
         ISNULL(sortorder, 0) DESC,
         Name

Вот демонстрация.

person John Woo    schedule 19.02.2018