ВЫБЕРИТЕ DISTINCT и ЗАКАЗАТЬ ПО - PullRequest
4 голосов
/ 09 августа 2010

Если я помещу ключевое слово DISTINCT, то получаю ошибку, иначе она работает нормально.

ОШИБКА: Сообщение 145, Уровень 15, Состояние 1, Процедура SP_Products_GetList, строка 15 Элементы ORDER BY должны появиться всписок выбора, если задано SELECT DISTINCT.

ALTER PROCEDURE [dbo].[SP_Products_GetList]    

@CatID int,
@CatName int,
@IsNew bit,
@InActive bit,
@SortBy varchar(50),
@SortType varchar(50)

AS    

SELECT DISTINCT Products.ProductID, ProductName, MAX(Price) Price, PriceID, [Description], Size, IsNew, InActive FROM (SELECT * FROM Products WHERE (@InActive is null or @InActive = InActive  ) AND ( @IsNew is null or @IsNew = IsNew )) Products
    INNER JOIN  ProductCategory
        on Products.ProductID = ProductCategory.ProductID 
    INNER JOIN  (
                    SELECT * FROM Categories 
                        WHERE 
                            ( @CatID is null or @CatID = CatID ) and
                            ( @CatName is null or @CatName = CatName )
                ) Categories 
        on ProductCategory.CatID = Categories.CatID 
    INNER JOIN ( 
                    SELECT Prices.ProductID, Prices.Price, Prices.PriceID, Prices.SizeID  FROM Prices 
                        INNER JOIN (
                            SELECT ProductID, max(Price) Price from Prices WHERE PriceID IN 
                                    ( SELECT MAX(PriceID) FROM Prices 
                                    GROUP BY ProductID , SizeID)
                            GROUP BY ProductID )  Prices_
                        ON Prices.ProductID = Prices_.ProductID AND Prices.Price = Prices_.Price                     
                ) as Prices 
        on Prices.ProductID = Products.ProductID 
        inner join  Sizes 
        on Sizes.SizeID = Prices.SizeID 
GROUP BY ProductName, CatName, Products.ProductID, Price, PriceID, [Description] ,Size, IsNew,InActive 
ORDER BY 
CASE @SortType 
    WHEN 'desc' THEN  
    CASE @SortBy         
        WHEN 'ProductName' THEN ProductName        
        END  
    END 
    DESC, 
CASE @SortType 
    WHEN 'desc' THEN  
    CASE @SortBy         
        WHEN 'ProductID' THEN Products.ProductID
        WHEN 'Price' THEN Price          
        END  
    END 
    DESC,     
CASE @SortType 
    WHEN 'asc' THEN  
    CASE @SortBy         
        WHEN 'ProductName' THEN ProductName        
        END  
    END 
    ASC, 
CASE @SortType 
    WHEN 'asc' THEN  
    CASE @SortBy         
        WHEN 'ProductID' THEN Products.ProductID
        WHEN 'Price' THEN Price          
        END  
    END 
    ASC

Ответы [ 5 ]

13 голосов
/ 09 августа 2010

Что произойдет, если вы сделаете ...

SELECT ProductID, ProductName...
FROM (
       SELECT DISTINCT Products.ProductID, ProductName...
) AS OrderProduct
ORDER BY [your order code...]
3 голосов
/ 09 августа 2010

Итак, пара вещей здесь.Я не говорю, что абсолютно уверен, что это правильно, но нужно учитывать несколько моментов.

  1. Это сообщение обычно появляется, когда вы не предоставляете свой заказ по столбцу в выбранном отчете.список.Единственная проблема, которую я мог видеть здесь, состоит в том, что, поскольку [Цена] является псевдонимом Макса (Цена), это может быть перепутано?Попробуйте указать Max (Price) в динамическом порядке по пунктам, которые вы строите внизу.

  2. Я заметил, что ваш динамический ордер может потенциально вернуть пару разных типов.Обычно вы хотите сохранить этот порядок с помощью предложений, работающих с одним и тем же типом данных.Тем не менее, похоже, что вы разделили типы сортировки (идентификатор продукта и цена, которые, как я полагаю, являются числовыми, и имя продукта, которое, как я предполагаю, является varchar).дать 1 выстрел.

1 голос
/ 24 марта 2013

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

Я бы получил сообщение об ошибке, хотя я включил столбцы широты и долготы в свой выбор.

Я обнаружил, что это сработало, если я включил в свой выбор те же вычисления:

SELECT DISTINCT ProductID, ProductName, ({my calculation}) AS distance
FROM my_table
ORDER BY {my calculation} ASC
0 голосов
/ 13 марта 2015

Решение для обхода DISTINCT будет следующим:

SELECT productName, productPrice
FROM Product
GROUP BY productName, productPrice
ORDER BY productName
0 голосов
/ 09 августа 2010

Пожалуйста, попробуйте следующий синтаксис

SELECT DISTINCT (Products.ProductID), ProductName, MAX(Price) Price,

Предыдущий синтаксис вызывает ошибку из-за того, что вы много раз использовали столбец Products.ProductID в процедуре.

Я много раз сталкивался с одной и той же проблемой.Итак, вышеуказанные решения сработали для меня.Пожалуйста, попробуйте это с вашей процедурой, так как у меня нет подходящей схемы для проверки.

...