понедельник, 25 марта 2013 г.

Как произвести сортировку набора на основе выражения

-- Я хочу отсортировать товары по Ценовой категории (Class). Class принимает значения H = High, M = Medium, L = Low-- Логично отсортировать в порядке
-- H = High, M = Medium, L = Low, NULL = Неизвестно-- Либо L = Low, M = Medium, H = High, NULL = Неизвестно


-- Возьмем прямой порядок

SELECT 
    Name
    ,ListPrice
    ,Class
FROM AdventureWorks2012.Production.Product
ORDER BY Class

-- Получили  NULL, H, L, M-- Возьмем обратный порядок порядок. Не то

SELECT 
    Name
    ,ListPrice
    ,Class
FROM AdventureWorks2012.Production.Product
ORDER BY Class

-- Получили M, L, H, NULL. . Не то


-- Можно добавить еще одно поле с CASE, вычисляющее желаемый номер сортировки в предложение SELECT

SELECT 
    Name
    ,ListPrice
    ,Class
    ,CASE
        WHEN Class = 'H' THEN 1
        WHEN Class = 'M' THEN 2
        WHEN Class = 'L' THEN 3
        ELSE 4
    END AS ClassOrder
FROM AdventureWorks2012.Production.Product
ORDER BY ClassOrder

-- Порядок сортировки логичный но появилось служебное поле ClassOrder, ненужное для представления


-- Перенесем CASE в предложение ORDER BY


SELECT 
    Name
    ,ListPrice
    ,Class
FROM AdventureWorks2012.Production.Product
ORDER BY
    CASE
        WHEN Class = 'H' THEN 1
        WHEN Class = 'M' THEN 2
        WHEN Class = 'L' THEN 3
        ELSE 4
    END

-- Задачка решена. Для красоты добавим сортировку по названию товара


SELECT 
    Name
    ,ListPrice
    ,Class
FROM AdventureWorks2012.Production.Product
ORDER BY
    CASE
        WHEN Class = 'H' THEN 1
        WHEN Class = 'M' THEN 2
        WHEN Class = 'L' THEN 3
        ELSE 4
    END
    , Name