Как отсортировать один столбец двумя способами - PullRequest
0 голосов
/ 20 июня 2020

У меня есть таблица с именем product и ее структура данных выборки данных следующим образом:

+-----------+-------------+-----------+
| ProductID | ProductName | SortValue |
+-----------+-------------+-----------+
| 1         | AA12        | 0         |
+-----------+-------------+-----------+
| 2         | AA10        | 0         |
+-----------+-------------+-----------+
| 3         | AA11        | 0         |
+-----------+-------------+-----------+
| 4         | AA13        | 0         |
+-----------+-------------+-----------+
| 5         | AA1         | 2         |
+-----------+-------------+-----------+
| 6         | AA2         | 1         |
+-----------+-------------+-----------+
| 7         | AA3         | 4         |
+-----------+-------------+-----------+
| 8         | AA4         | 3         |
+-----------+-------------+-----------+
| 9         | AA5         | 5         |
+-----------+-------------+-----------+
| 10        | AA6         | 6         |
+-----------+-------------+-----------+

Мне нужно вставить эти данные таблицы в другую временную таблицу с сортировкой, используя ее SortValue. Здесь вы можете увидеть несколько sortvalue как 0. Те, что 0 состоит из SortValue, должны быть вставлены в конец таблицы по ее ProductName. Мой ожидаемый результат должен быть:

+-----------+-------------+-----------+
| ProductID | ProductName | SortValue |
+-----------+-------------+-----------+
| 6         | AA2         | 1         |
+-----------+-------------+-----------+
| 5         | AA1         | 2         |
+-----------+-------------+-----------+
| 8         | AA4         | 3         |
+-----------+-------------+-----------+
| 7         | AA3         | 4         |
+-----------+-------------+-----------+
| 9         | AA5         | 5         |
+-----------+-------------+-----------+
| 10        | AA6         | 6         |
+-----------+-------------+-----------+
| 2         | AA10        | 0         |
+-----------+-------------+-----------+
| 3         | AA11        | 0         |
+-----------+-------------+-----------+
| 1         | AA12        | 0         |
+-----------+-------------+-----------+
| 4         | AA13        | 0         |
+-----------+-------------+-----------+

Как я могу это сделать? Я только что пробовал что-то вроде этого.

DECLARE @tmp TABLE (
    [ProductID] INT,
    [ProductName] VARCHAR(50),
    [SortValue] INT )
    
    INSERT INTO @tmp
    p.ProductID,p.ProductName,p.SortValue
    SELECT FROm Product p ORDER by p.SortValue

1 Ответ

2 голосов
/ 20 июня 2020

Для начала: таблицы базы данных представляют неупорядоченный набор строк. Не существует внутреннего порядка строк: когда вы select из таблицы, вы контролируете порядок, в котором строки возвращаются с помощью предложения order by.

Итак, я понимаю ваш вопрос, как выберите строк в соответствующем порядке. Для этого вы можете использовать условную сортировку:

select t.*
from mytbable
order by 
    case when sortValue = 0 then 1 else 0 end,
    sortValue,
    productName

Выражение case на первом уровне сортировки помещает строки, где sortValue не является 0 первыми. Затем группы сортируются по sortValue и productName.

...