T-SQL Order не работает с Cast в MSSQL - PullRequest
0 голосов
/ 29 августа 2018

Не получается получить заказ на работу с актерами. Может кто-нибудь помочь?

Сообщение об ошибке:

Неверное имя столбца NewPrice

Select top 100 ma.*,
               (Select Top (1) Price from [dbo].[ItemSKU] Where ma.OldSku = NewSKu) as NewPrice
from [dbo].[2018] as ma
order by cast (NewPrice as decimal(10,2)) desc

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Вы получаете значения NewPrice, используя подзапрос, поэтому вы не можете использовать приведение с orderby для вычисляемого столбца в том же запросе. Самый простой способ может быть, как показано ниже.

Раствор 1

select * from (
Select top 100 ma.*,
               (Select Top (1) Price from [dbo].[ItemSKU] Where ma.OldSku = NewSKu) as NewPrice
from [dbo].[2018] as ma
)a order by cast(NewPrice as decimal(10,2)) desc

Раствор 2

Select top 100 ma.*,
               cast((Select Top (1) Price from [dbo].[ItemSKU] Where ma.OldSku = NewSKu)as decimal(10,2)) as NewPrice
from [dbo].[2018] as ma
order by NewPrice desc
0 голосов
/ 29 августа 2018

Это тонкая проблема. Как объясняет документация :

Указывает столбец или выражение для сортировки результата запроса. задавать. Столбец сортировки может быть указан как имя или псевдоним столбца, или неотрицательное целое число, представляющее положение столбца в выберите список.

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

Я думаю, что самое простое решение - сделать cast() в подзапросе. Если вы хотите упорядочить по значению, разве это не то, что вы хотите увидеть?

Select top 100 ma.*,
       (Select Top (1) cast(i.Price as decimal(10, 2))
        from [dbo].[ItemSKU] i
        Where ma.OldSku = i.NewSKu
       ) as NewPrice
from [dbo].[2018] ma
order by NewPrice desc;

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

0 голосов
/ 29 августа 2018

Причина - область действия столбца. Вы вводите колонку одновременно с ее использованием. Это не разрешено в SQL Server.

Для ясности - вы можете использовать псевдоним столбца в ORDER BY, но проблема здесь в том, что вы используете его внутри функции CAST - это проблема.

Правильный синтаксис будет (это решение путем изменения области действия):

SELECT TOP 100 * FROM (
    SELECT ma.*,
           (SELECT TOP (1) Price FROM [dbo].[ItemSKU] WHERE ma.OldSku = NewSKu) AS NewPrice
    FROM [dbo].[2018] AS ma
) a ORDER BY CAST(NewPrice AS DECIMAL(10,2)) DESC

или (здесь мы делаем все операции, необходимые для заказа в списке столбцов, чтобы вы могли ссылаться на псевдоним столбца в ORDER BY)

SELECT TOP 100 ma.*,
       CAST((SELECT TOP (1) Price FROM [dbo].[ItemSKU] WHERE ma.OldSku = NewSKu) AS DECIMAL(10, 2)) AS NewPrice
FROM [dbo].[2018] AS ma
ORDER BY NewPrice
...