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
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
Je viens d'éditer la réponse maintenant que j'ai une idée plus claire de ce que vous cherchez. –
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