2016-08-03 1 views
0

Как использовать заказ по вычисленному полю в SQL?Как использовать заказ по вычисленному полю в SQL?

select a.Customer 
    ,a.PlanTo 
    ,a.Dollar01 
    ,a.Dollar02 
    ,a.Dollar03 
    ,a.Dollar04 
    ,a.Dollar05 
    ,a.Dollar06 
    ,a.Dollar07 
    ,a.Dollar08 
    ,a.Dollar09 
    ,a.Dollar10 
    ,a.Dollar11 
    ,a.Dollar12 
    ,(CAST(a.Dollar01 as decimal) + CAST(a.Dollar02 as decimal) 
    + CAST(a.Dollar03 as decimal) + CAST(a.Dollar04 as decimal) 
    + CAST(a.Dollar05 as decimal) + CAST(a.Dollar06 as decimal) 
    + CAST(a.Dollar07 as decimal) + CAST(a.Dollar08 as decimal) 
    + CAST(a.Dollar09 as decimal) + CAST(a.Dollar10 as decimal) 
    + CAST(a.Dollar11 as decimal) + CAST(a.Dollar12 as decimal)) as TOTAL1 
from MDM_STAT.sds.SMarginText a 
where a.salesyear = '2016' 
order by a.total1 

Это дает мне столбец «total1» не существует, но, как вы видите, я создал это и работает, если я не использую оговорку order by.

+1

Удалить псевдоним 'a.' - попробуйте' order by total1' ... – sgeddes

+1

'a.total1' не существует, поскольку SQL Server будет искать этот столбец в' SMarginText', но 'ORDER BY TOTAL1 ; 'будет работать нормально. –

+0

(1) Отформатируйте свой код и (2) Разъясните (теги), какую СУБД вы фактически используете, - это PostgreSQL или SQL Server? – Nicarus

ответ

3

Вы можете сделать то, что предлагает Mureinik, и использовать порядковое обозначение ORDER BY 13, что означает «заказать по 13-й колонке». Тем не менее, я бы старался избегать этого, потому что трудно сказать, что у вас есть , намеревающийся заказать, если вы вернетесь позже. Кроме того, если вам нужно добавить столбец или изменить порядок, вы должны помнить об обновлении предложения ORDER BY. Это легко пропустить.

Как упоминается в комментариях, можно использовать псевдоним, указанный вами в ORDER BY. Однако, поскольку это псевдоним столбца, вам нечего полностью квалифицировать. a.TOTAL1 ничего не значит. Вы должны ORDER BY TOTAL1:

select a.Customer 
    ,a.PlanTo 
    ,a.Dollar01 
    ,a.Dollar02 
    ,a.Dollar03 
    ,a.Dollar04 
    ,a.Dollar05 
    ,a.Dollar06 
    ,a.Dollar07 
    ,a.Dollar08 
    ,a.Dollar09 
    ,a.Dollar10 
    ,a.Dollar11 
    ,a.Dollar12 
    ,(CAST(a.Dollar01 as decimal) + CAST(a.Dollar02 as decimal) 
    + CAST(a.Dollar03 as decimal) + CAST(a.Dollar04 as decimal) 
    + CAST(a.Dollar05 as decimal) + CAST(a.Dollar06 as decimal) 
    + CAST(a.Dollar07 as decimal) + CAST(a.Dollar08 as decimal) 
    + CAST(a.Dollar09 as decimal) + CAST(a.Dollar10 as decimal) 
    + CAST(a.Dollar11 as decimal) + CAST(a.Dollar12 as decimal)) as TOTAL1 
from MDM_STAT.sds.SMarginText a 
where a.salesyear = '2016' 
order by total1 

Это работает из-за запроса решить заказ. ORDER BY решается после SELECT, в отличие от WHERE или FROM, которые решаются до SELECT и поэтому не могут ссылаться на псевдонимы столбцов в SQL Server.

Это может быть запутанным или неоднозначным, если ваш псевдоним столбца имеет то же имя, что и столбец из таблицы, поэтому вам нужно знать об этом.

+0

Спасибо за объяснение. Это было очень полезно в понимании того, как работают предложения. Ценить это. –

+0

@RahulBanerjee Полезно знать, что запросы заказа выполнены. [Здесь] (http://stackoverflow.com/a/17403990/696808) более подробно об этом, если вам интересно. –

1

Самый простой способ - использовать номер столбца в списке выбора вместо его имени: ORDER BY 13.

+2

[Такая страшная идея рекомендовать, особенно для производственного кода, поскольку ординалы очень хрупкие] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/06/bad-habits- к кик-порядку по-ordinal.aspx). В других новостях самый простой способ мыть посуду - это выбросить их и купить новые. («Самый простой» и «лучший» редко совпадают.) –

2

Публикация комментария Аарон Бертрана как сообщества вики, как я считаю, что это самый прямой ответ:

a.total1 не существует, так как SQL Server будет искать для этого столбца в SMarginText, но ORDER BY TOTAL1; будет работать нормально ,