У меня есть набор результатов с определенной группировкой (для отчета). Есть вероятность, что позиция не назначена и поэтому не имеет «Grid_Group». В этом случае я присваиваю значение 99. Это работает правильно, за исключением порядка, 99 всегда первым и должно быть последним (если я делаю desc, он находится внизу). Я пробовал приведение на выбранной стороне, а также в порядке по Grid_Group, но оба имеют одинаковые результаты с 99 наверху. (Сервер SQL 2008)

Вот фрагмент, все остальные ненужные столбцы я удаляю.

SELECT s.SessionNumber,Position.PositionName,(Select CASE when dbo.Position.Grid_Group is null THEN 99 ELSE dbo.Position.Grid_Group END) as Grid_Group 
             FROM dbo.USession AS us Left Outer JOIN  
                     dbo.Position ON us.PositionId = dbo.Position.PositionId FULL OUTER JOIN  
                     dbo.Sessions AS s ON us.SessionId = s.SessionId  
                     ORDER BY S.SessionNumber, dbo.Position.Grid_Group

Мысли?

1
PGB 21 Дек 2013 в 18:51

2 ответа

Лучший ответ

Вам также необходимо применить CASE к вашему заказу (имейте в виду, что это нарушит использование индекса при операции сортировки). Ваш ORDER BY ссылается на столбец исходной таблицы, а не на столбец результата псевдонима. Что-то вроде этого должно помочь:

SELECT
    s.SessionNumber,Position.PositionName,
    (CASE
        WHEN dbo.Position.Grid_Group IS NULL THEN 99
        ELSE dbo.Position.Grid_Group
    END) AS Grid_Group 
FROM dbo.USession AS us
LEFT OUTER JOIN dbo.Position ON us.PositionId = dbo.Position.PositionId
FULL OUTER JOIN dbo.Sessions AS s ON us.SessionId = s.SessionId  
ORDER BY
    S.SessionNumber,
    (CASE
        WHEN dbo.Position.Grid_Group IS NULL THEN 99
        ELSE dbo.Position.Grid_Group
    END)

Я позволил себе применить небольшое форматирование вашего SQL.

1
kastermester 21 Дек 2013 в 14:59

ORDER BY в этом случае не увидит ваши вычисляемые столбцы. Чтобы получить желаемый эффект, вам нужно будет ORDER BY то же выражение (которое демонстрирует ответ kastermester) или обернуть запрос в общее табличное выражение и ORDER BY при выборе из этого , что-то вроде;

WITH cte AS (
  SELECT s.SessionNumber, p.PositionName, COALESCE(p.Grid_Group, 99) Grid_Group 
  FROM dbo.USession AS us 
  LEFT OUTER JOIN dbo.Position p ON us.PositionId = p.PositionId 
  FULL OUTER JOIN dbo.Sessions s ON us.SessionId  = s.SessionId
)
SELECT * FROM cte ORDER BY SessionNumber, Grid_Group;
1
Joachim Isaksson 21 Дек 2013 в 15:13