SELECT DISTINCT和ORDER BY

时间:2010-08-09 12:16:16

标签: sql-server sql-server-2005 tsql sql-order-by distinct

如果我放置DISTINCT关键字,我会收到其他错误,但它工作正常。

错误:消息145,级别15,状态1,过程SP_Products_GetList,第15行 如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中。

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 个答案:

答案 0 :(得分:13)

如果你这样做会发生什么......

SELECT ProductID, ProductName...
FROM (
       SELECT DISTINCT Products.ProductID, ProductName...
) AS OrderProduct
ORDER BY [your order code...]

答案 1 :(得分:3)

所以,这里有几件事。我不是说我绝对相信这些是对的,而是需要考虑的一些事情。

  1. 当您不在选择明确列表中按列提供订单时,通常会显示此消息。我能看到的唯一问题是,由于[Price]是Max(Price)的别名,它可能会混淆吗?尝试通过底部构建的子句在动态顺序中指定最大(价格)。

  2. 我注意到您的动态订单可能会返回几种不同的类型。您通常希望通过使用相同数据类型的子句来保持这些顺序。但是,您似乎将分类类型(产品ID和价格,我猜是数字和产品名称,我认为是varchar)分开。

  3. 所以,没关系2,但要给1分。

答案 2 :(得分:1)

当我尝试按照我的桌子上的计算进行排序时遇到了同样的问题(我试图按照基于纬度和经度列的记录的距离进行排序)。

即使我在我的选择中包含纬度和经度列,我也会收到错误。

如果我在我的选择中包含相同的计算,我发现它有效:

SELECT DISTINCT ProductID, ProductName, ({my calculation}) AS distance
FROM my_table
ORDER BY {my calculation} ASC

答案 3 :(得分:0)

请尝试使用以下语法

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

由于您在过程中多次使用了列Products.ProductID,因此以前的语法会出错。

我多次遇到同样的问题。所以,上述解决方案对我有用。请尝试使用您的程序,因为我没有正确的架构来测试它。

答案 4 :(得分:0)

解决DISTINCT的问题如下:

SELECT productName, productPrice
FROM Product
GROUP BY productName, productPrice
ORDER BY productName