2010-06-14 6 views
0

J'essaie de sélectionner la hiérarchie d'un arbre de catégorie de produit dans SQL.Expression de table commune conditionnelle (CTE) dans SQL

Mon code se présente comme suit. J'essaie d'obtenir un ordre de tri dynamique, en utilisant IF ou Case When sur le paramètre SortOrder.

La ligne commentée doit être active si @SortOrder est égal à 'sortorder'. J'ai essayé d'ajouter If Else déclaration autour de lui, mais j'ai échoué ...

Pouvez-vous aider?

CREATE PROCEDURE [dbo].[ProductCategory_SelectHierarchy] 
    @SortOrder varchar(30) 
AS 
    SET NOCOUNT ON; 

WITH Categories (Id,ParentId,SortOrder,RowOrder) as 
(
     SELECT parentCategory.Id, 
         parentCategory.ParentId, 
         parentCategory.SortOrder, 
         --cast(REPLACE(STR(parentCategory.SortOrder, 8), ' ', '0') as varchar(30)) 'RowOrder' 
         cast(CAST(DATEPART(YEAR, parentCategory.DateCreated) as varchar(4)) + 
         CAST(DATEPART(MONTH, parentCategory.DateCreated) as varchar(2)) + 
         CAST(DATEPART(DD, parentCategory.DateCreated) as varchar(2)) + 
         CAST(DATEPART(HOUR, parentCategory.DateCreated) as varchar(2)) as varchar(50)) 'RowOrder' 
     FROM  ProductCategories parentCategory 
     WHERE  ParentId = 0 

     UNION ALL 

     SELECT childCategories.Id, 
         childCategories.ParentId, 
         childCategories.SortOrder, 
         --cast(Categories.RowOrder + REPLACE(STR(childCategories.SortOrder, 8), ' ', '0') as varchar(30)) 'RowOrder' 
         cast(Categories.RowOrder + '/' + CAST(DATEPART(YEAR, childCategories.DateCreated) as varchar(4)) + 
         CAST(DATEPART(MONTH, childCategories.DateCreated) as varchar(2)) + 
         CAST(DATEPART(DD, childCategories.DateCreated) as varchar(2)) + 
         CAST(DATEPART(HOUR, childCategories.DateCreated) as varchar(2)) as varchar(50)) 'RowOrder' 
     FROM  ProductCategories childCategories 
     JOIN  Categories 
     ON   childCategories.ParentId = Categories.Id 
) 

SELECT pc.*, Categories.RowOrder 
FROM Categories 
INNER JOIN ProductCategories pc ON pc.Id = Categories.Id 
ORDER BY RowOrder 

Répondre

0

Vous devriez être en mesure de faire le tri comme ceci:

ORDER BY 
    CASE 
     WHEN @SortOrder = 'date_column' THEN CONVERT(VARCHAR(20), date_column, 120) 
     WHEN @SortOrder = 'customer_id' THEN RIGHT(REPLICATE('0', 20) + CAST(customer_id AS VARCHAR(20)), 20) 
     WHEN @SortOrder = 'name' THEN name 
     ELSE sort_order 
    END 

La clé est d'obtenir tous vos colonnes triables (ou expressions) pour finir par le même type de données.

+0

Impossible de le faire fonctionner. Cependant, votre pseudo code ne fait pas ce que j'essaye d'atteindre. Je veux que @SortOrder soit quelque chose de plus statique, comme 'créé', 'salescount', 'name' ou 'custom'. Chaque cas doit entraîner des instructions SQL différentes. – MartinHN

+0

Je viens d'éditer la réponse maintenant que j'ai une idée plus claire de ce que vous cherchez. –

+0

Oh, je devrais faire dans l'ordre par clause. j'ai changé mon code, ajouter les 4 colonnes à l'ensemble de données, et le faire dans l'ordre par: ORDER BY CAS \t QUAND @SortOrder = 'NameSortedOrder' ALORS \t Categories.NameSortedOrder QUAND @SortOrder = « SalesCountOrder 'THEN Categories.SalesCountOrder \t QUAND @SortOrder =' DateCreatedOrder 'PUIS Categories.DateCreatedOrder \t ELSE Categories.SortOrder FIN – MartinHN

Questions connexes