2011-02-14 5 views
5

Je veux commander une requête SQL Select où il y a 2 champs qui sont dans l'ordre par. J'ai alors besoin de décider si l'un est décroissant et l'autre ascendant. Comment cela se faitcomment commander 2 champs SQL dans asc et desc dynamiquement

Je veux quelque chose comme:

Select * from Customer 
Order By Date @asc_or_Desc_date, Name @asc_or_Desc_name 

Quelqu'un at-il des idées?

J'ai essayé mais il semble échouer

SELECT 

    Customer_ID,       
    Name,        
    Age           

FROM #Customer 
ORDER BY 

    CASE WHEN @fieldSort ='Name' 
     THEN ROW_NUMBER() over (order by Name) * 
      case when @directionOfSort = 'A' 
       THEN 1 ELSE -1 END, 
      ROW_NUMBER() over (order by Age) * 
      case when @directionOfSort = 'A' 
       THEN 1 ELSE -1 END, 
     END 

Quelqu'un sait comment trier cela?

+0

Si vous allez ajouter plus de détails à votre question, s'il vous plaît essayez de le faire de telle sorte que nos réponses ne sont pas devenues inutiles à cause de cela. Si vous voyez cela probable, mieux postez une nouvelle question, éventuellement en référence à celle-ci, si nécessaire. –

Répondre

3

Vous devrez créer votre instruction SQL dynamique afin d'utiliser une variable:

DECLARE @asc_desc VARCHAR(4); 

SET @asc_desc = 'DESC'; 

DECLARE @sql NVARCHAR(1000); 

SET @sql = 'Select * from Customer Order By Date ' + @asc_desc + ', Name'; 

EXEC sp_executesql @sql 

Cela date de commande et DESCENDING Nom ASCENDING.

Vous devez uniquement ajouter DESC si vous souhaitez utiliser DESCENDING comme ASCENDING est la valeur par défaut.

+0

'sp_execute' a besoin de' EXEC' avant lui dans ce cas. –

+0

@Andriy M: Oui, j'essayais d'exécuter le code dans SSMS ainsi que de corriger la question. –

+1

REMARQUE: Soyez très conscient de l'injection SQL lors de cette opération. Les paramètres doivent être fournis par votre propre code, et/ou les valeurs doivent être validées. Si vous faites cela dans une procédure stockée, vérifiez-les dans la procédure stockée, juste pour être sûr. – MatBailie

2

Dans SQL Server 2005+, vous pouvez utiliser l'appareil suivant:

WITH CustomerCTE AS (
    SELECT 
    *, 
    DateSort = ROW_NUMBER() OVER (ORDER BY Date), 
    NameSort = ROW_NUMBER() OVER (ORDER BY Name) 
    FROM Customer 
) 
SELECT * 
FROM CustomerCTE 
ORDER BY DateSort * @DateSortDir, NameSort * @NameSortDir 

Les vars dans ce cas devrait être soit 1 ou -1.


EDIT

L'exemple en outre affiché semble impliquer que l'ordre des colonnes à utiliser ORDER BY devrait être aussi dynamique. Et il semble aussi maintenant que la direction de l'ordre est spécifiée uniformément pour les deux colonnes.

Que ce soit le cas ou non (la question est devenue un peu plus ambiguë), les deux sont supposés dans ma deuxième solution.

DECLARE @IntSortDir int; 
SET @IntSortDir = CASE @directionOfSort WHEN 'A' THEN 1 ELSE -1 END; 

WITH CustomerCTE AS (
    SELECT 
    Customer_ID, 
    Name, 
    Age, 
    NameSort = ROW_NUMBER() OVER (ORDER BY Name), 
    AgeSort = ROW_NUMBER() OVER (ORDER BY Date) 
    FROM Customer 
) 
SELECT 
    Customer_ID, 
    Name, 
    Age 
FROM CustomerCTE 
ORDER BY 
    CASE @fieldSort WHEN 'Age' THEN AgeSort END * @IntSortDir, 
    NameSort * @directionOfSort, 
    CASE @fieldSort WHEN 'Name' THEN AgeSort END * @IntSortDir 

@fieldSort spécifie la colonne d'ordre primaire. L'autre devient automatiquement le secondaire.

+0

SELECT \t EXT_Design_Standard_ID \t \t \t \t \t \t \t Standards_Name \t \t \t \t \t \t \t \t \t Ref \t \t \t \t \t \t \t \t \t \t \t DE #LastUpdateTemp --ORDER PAR Date_Changed DESC ORDER BY \t \t CASE QUAND @fieldSort = 'Nom Normes' \t \t ALORS ROW_NUMBER() plus (par ordre Standards_Name) * \t \t \t cas où @directionOfSort = 'A' \t \t \t \t ALORS une AUTRE -1 END, \t \t \t \t ROW_NUMBER() plus (par ordre Ref) * \t \t \t cas où @directionOfSort = 'A' \t \t \t \t ALORS 1 AUTRE FIN -1, \t \t FIN, – user532104

+0

problème avec les mines, il échoue, une idée de faire le tri? – user532104

+0

Vous voulez dire que vous voulez non seulement que la direction de la commande soit dynamique, mais aussi l'ordre des colonnes 'ORDER BY'? –

5
SELECT 
    Customer_ID,       
    Name,        
    Age           
FROM 
    #Customer 
ORDER BY 
    CASE WHEN @field = 'Name' AND @direction = 'A' THEN Name ELSE NULL END ASC, 
    CASE WHEN @field = 'Name' AND @direction = 'D' THEN Name ELSE NULL END DESC, 
    CASE WHEN @field = 'Age' AND @direction = 'A' THEN Age ELSE NULL END ASC, 
    CASE WHEN @field = 'Age' AND @direction = 'D' THEN Age ELSE NULL END DESC 


Je ne voudrais pas le faire pendant de nombreuses combinaisons différentes cependant. Si vous avez beaucoup de combinaisons que je ferais somethign selon les critères suivants ...

SELECT 
    Customer_ID,       
    Name,        
    Age           
FROM 
(
    SELECT 
    Customer_ID, 
    Name, 
    ROW_NUMBER() OVER (ORDER BY Name) AS "name_order", 
    Age, 
    ROW_NUMBER() OVER (ORDER BY Age) AS "age_order" 
    FROM 
    #Customer 
) 
    AS [data] 
ORDER BY 
    CASE @field1 
    WHEN 'Name' THEN CASE @direction1 WHEN 'A' THEN name_order ELSE -name_order END 
    WHEN 'Age' THEN CASE @direction1 WHEN 'A' THEN age_order ELSE -age_order END 
    ELSE NULL 
    END, 
    CASE @field2 
    WHEN 'Name' THEN CASE @direction2 WHEN 'A' THEN name_order ELSE -name_order END 
    WHEN 'Age' THEN CASE @direction2 WHEN 'A' THEN age_order ELSE -age_order END 
    ELSE NULL 
    END 

Répétez autant de fois que nécessaire ...


Remarque: Juste parce que cela peut être fait de cette façon, cela ne signifie pas que cela devrait être fait de cette façon.

+0

+1 pour le premier, même si c'est plus encombrant, parce que le second ne commande que d'une colonne alors qu'il semble que l'OP le veut être par deux. –

+0

La question syas Nom Age, et Asc Desc? Bien que je puisse juste être aveugle, ce n'est pas rare ... – MatBailie

+0

Même logique, mais légèrement refactorisée, pour rendre évident comment étendre à plusieurs ordres. – MatBailie

1
Here is the solution 

Explanation: 
1. Ordering the row number on the basis of SQL input param order by (DESC, ASC) 
2. Againt ordering the row number in outer query 

Try this code (working) 

DECLARE @PageNum int 
DECLARE @PageSize int 
DECLARE @TotalRowsNum int 
DECLARE @SortColumn varchar(200) 
DECLARE @SortOrder varchar(5) 

SET @PageNum = 4; 
SET @PageSize = 10; 
SET @SortColumn = 'CODE_ID'; 
SET @SortOrder = 'DESC'; 

WITH QueryResult AS 
(

SELECT *, 
CASE @SortOrder WHEN 'ASC' THEN 
ROW_NUMBER() OVER(ORDER BY @SortColumn ASC) 
ELSE 
ROW_NUMBER() OVER(ORDER BY @SortColumn DESC) 
END AS 'RowNumber' 

FROM TABLE_NAME 
) 
SELECT * FROM QueryResult 
WHERE RowNumber BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize 
ORDER BY RowNumber ASC 
Questions connexes