Comment puis-je créer un type de requête « filtre par prix »?
-
20-08-2019 - |
Question
J'utilise VBScript (ASP classique) et SQL Server; Je suis en train d'avoir une section sur le site où vous pouvez voir un nombre de produits à certains niveaux de prix. Quelque chose comme:
$50 - $100 (4)
$100 - $500 (198)
$500 - $1000 (43)
Pour l'amour de moi, je ne peux pas trouver un bon moyen de faire une requête comme celui-ci. Je veux dire ... Je sais comment obtenir le nombre de produits à une certaine gamme de prix, mais je ne peux pas comprendre comment le faire à plusieurs gammes de prix différents sans avoir à écrire un bateau plein de requêtes imbriquées pour regrouper tous les résultats , d'autant plus que les fourchettes de prix peuvent varier considérablement selon les produits.
Y at-il une « règle » lorsque vous faites quelque chose comme cela à la façon dont vous figurez les différentes fourchettes de prix?
La solution
La façon la plus efficace de le faire dans SQL (je crois) est d'utiliser une construction sum case
:
select sum(case when Price >= 50 and Price < 100 then 1 else 0 end) as 50to100,
sum(case when Price >= 100 and Price < 500 then 1 else 0 end) as 100to500,
sum(case when Price >= 500 and Price < 1000 then 1 else 0 end) as 500to1000
from Products
Cela ne nécessite qu'un seul balayage de la table.
Autres conseils
Tableau lecteur il:
SELECT pr.MinPrice, pr.MaxPrice, COUNT(*)
FROM Products AS p
INNER JOIN PriceRanges AS pr
ON p.UnitPrice BETWEEN pr.MinPrice AND pr.MaxPrice
GROUP BY pr.MinPrice, pr.MaxPrice
ORDER BY pr.MinPrice, pr.MaxPrice
Si vous avez besoin différentes fourchettes de prix pour différentes catégories de produits:
SELECT pr.ProductCategory, pr.MinPrice, pr.MaxPrice, COUNT(*)
FROM Products AS p
INNER JOIN PriceRanges AS pr
ON p.ProductCategory = pr.ProductCategory
AND p.UnitPrice BETWEEN pr.MinPrice AND pr.MaxPrice
GROUP BY pr.ProductCategory, pr.MinPrice, pr.MaxPrice
ORDER BY pr.ProductCategory, pr.MinPrice, pr.MaxPrice
Vous devrez ajouter un peu de nettoyage et de gérer la fin des plages.
Vous pouvez utiliser des requêtes syndicales
SELECT '100 - 200', COUNT(*) FROM Products
WHERE Price >= 100 AND Price <= 200
UNION
SELECT '300 - 400', COUNT(*) FROM Products
WHERE Price >= 300 AND Price <= 400
Créer une fonction (UDF) qui concerne la fourchette de prix d'une valeur
$50 - $100 = 1
$100 - $500 = 2
$500 - $1000 = 3
etc.
Ensuite, faites un groupement de sélection par la fonction sur la colonne de valeur.
Je serais probablement utiliser une fonction SQL qui a attribué chaque enregistrement avec un code de catégorie en fonction de la valeur, puis groupe par le code de la catégorie avec un compte.