2010-08-09 12 views
4

Si je place le mot-clé DISTINCT, j'obtiens une erreur sinon cela fonctionne correctement.SELECT DISTINCT et ORDER BY

ERREUR: Msg 145, Niveau 15, État 1, Procédure SP_Products_GetList, Ligne 15 éléments ORDER BY doit apparaître dans la liste de sélection est spécifiée si 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 
+0

Qui veut trouver l'aiguille? – Nix

+0

Juste un conseil: essayez d'éviter d'utiliser SELECT * pour des raisons de performance ... –

+0

Thnx pour suggestion –

Répondre

12

Que se passe si vous ...

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

est-ce une bonne pratique? – HaBo

0

S'il vous plaît essayer avec la syntaxe suivante

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

syntaxe précédente vous donne erreur à cause de vous avez utilisé la colonne Products.ProductID à plusieurs reprises dans une procédure.

J'ai rencontré le même problème plusieurs fois. Donc, les solutions ci-dessus avaient fonctionné pour moi. S'il vous plaît essayez ceci avec votre procédure car je n'ai pas de schéma approprié pour le tester.

+0

@Nix Merci pour votre suggestion, mais cela ne fonctionne pas j'ai essayé. –

3

Ainsi, un couple de choses ici. Je ne dis pas que je suis absolument sûr que ce soit juste, mais quelques points à considérer.

  1. Ce message apparaît généralement lorsque vous ne spécifiez pas votre commande par colonne dans la liste de sélection. Le seul problème que j'ai pu voir ici est que puisque [Price] est l'alias de Max (Prix), il est peut-être confus? Essayez de spécifier Max (Prix) dans l'ordre dynamique par les clauses que vous construisez en bas.

  2. J'ai noté que votre ordre dynamique par pourrait potentiellement avoir un couple de types différents retournés. Vous souhaitez généralement conserver ces commandes par clauses travaillant avec le même type de données. Cependant, il semble que vous ayez séparé les types de tri (ID de produit & prix que je suppose sont numériques et productname que je suppose est un varchar).

Donc, ne faites pas attention à 2, mais donnez 1 coup.

+0

@Nix Thanx cher mais j'ai testé les deux option. Ce n'est pas résoudre le problème. mais Mr.Yves M. a donné une solution maintenant –

+0

@SOF User @jkc a répondu à cette question ... je viens de l'éditer. – Nix

1

J'ai rencontré ce même problème en essayant de commander par un calcul sur ma table (j'essayais de commander par la distance d'un enregistrement basé sur les colonnes de latitude et de longitude).

Je recevrais l'erreur même si j'ai inclus les colonnes de latitude et de longitude dans ma sélection.

je l'ai trouvé travaillé si j'inclus le même calcul dans ma sélection:

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

Une solution pour travailler autour DISTINCT serait la suivante:

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