2010-12-15 31 views
1

Ceci est pour le site de commerce électronique. Actuellement, lorsque le client clique sur une catégorie, l'application trouvera le prix maximum et le prix minimum des produits dans cette catégorie, divisera la différence par 5 (seulement 5 gammes de prix requises), puis regroupera les produits selon des gammes de prix définies. Le problème est que lorsque 90% des produits coûtent environ 50 $, mais que peu de produits coûtent environ 3000 $, la plupart des produits sont regroupés dans la première gamme, et les plages suivantes ne contiennent que peu d'articles. Cela va vaincre le but d'avoir des fourchettes de prix.T-SQL: Comment créer une gamme de prix de manière dynamique en fonction de la catégorie?

Situation idéale est, les gammes de prix d'affichage de l'application en fonction de la population des produits, comme:

  • First 10% des produits en 1ère gamme de prix
  • Après 25% en 2ème gamme de prix
  • Après 25% dans la gamme de prix
  • 3nd Après 25% dans la gamme de prix 4ND
  • Dernière 15% dans 5 gamme de prix

mais la valeur min et max de chaque gamme de prix varie en fonction de la catégorie. Cela peut-il être fait dans une procédure à 1 magasin (SQL Express 2008)?

? Des idées?

Merci à l'avance.

+0

Où trouvez-vous les gammes de prix à partir? Et s'il vous plaît ajouter le schéma de table + certaines données trop – gbn

+1

si la plupart des produits ont un prix d'environ 50 $ est-il logique de faire une fourchette de prix? Si vous avez des prix comme 49.50-49.80 49.81-49.99 50.00-50.50 50.51-50.99 51.00-5000 cela n'a pas de sens pour mon. Est-ce ce que tu veux? – Dainius

+0

gbn: Les fourchettes de prix seront générées dynamiquement, en fonction du prix minimum et du prix maximum des produits de cette catégorie. – Mint

Répondre

1

Le mélange TOP PERCENT et les plages précédemment trouvées donneraient les cinq fourchettes de prix.

Déclaration SQL

DECLARE @p1 INTEGER 
DECLARE @p2 INTEGER 
DECLARE @p3 INTEGER 
DECLARE @p4 INTEGER 
DECLARE @p5 INTEGER 
DECLARE @p6 INTEGER 
DECLARE @p7 INTEGER 
DECLARE @p8 INTEGER 
DECLARE @p9 INTEGER 
DECLARE @p10 INTEGER 


/* Price category 1 */ 
SELECT @p1 = MIN(Price), @p2 = MAX(Price) FROM (SELECT TOP 10 PERCENT Price FROM @Products ORDER BY Price) c 

/* Price category 2 */ 
SELECT @p3 = MIN(Price), @p4 = MAX(Price) FROM (SELECT TOP 25 PERCENT Price FROM @Products WHERE Price > @p2 ORDER BY Price) c     

/* Price category 3 */ 
SELECT @p5 = MIN(Price), @p6 = MAX(Price) FROM (SELECT TOP 25 PERCENT Price FROM @Products WHERE Price > @p4 ORDER BY Price) c     

/* Price category 4 */ 
SELECT @p7 = MIN(Price), @p8 = MAX(Price) FROM (SELECT TOP 25 PERCENT Price FROM @Products WHERE Price > @p6 ORDER BY Price) c       

/* Price category 5 */ 
SELECT @p9 = MIN(Price), @p10 = MAX(Price) FROM @Products WHERE Price > @p8 

SELECT 'Category 1', [Low] = @p1, [High] = @p2 
UNION ALL SELECT 'Category 2', @p3, @p4 
UNION ALL SELECT 'Category 3', @p5, @p6 
UNION ALL SELECT 'Category 4', @p7, @p8 
UNION ALL SELECT 'Category 5', @p9, @p10 

Les données de test

DECLARE @Products TABLE (Price INTEGER) 

INSERT INTO @Products 
      SELECT (50) 
UNION ALL SELECT (51) 
UNION ALL SELECT (52) 
UNION ALL SELECT (53) 
UNION ALL SELECT (54) 
UNION ALL SELECT (55) 
UNION ALL SELECT (56) 
UNION ALL SELECT (57) 
UNION ALL SELECT (58) 
UNION ALL SELECT (59) 
UNION ALL SELECT (60) 
+0

Merci Lieven. :) – Mint

+0

Pour la première fois, j'ai * réellement utilisé la syntaxe PERCENT * donc merci de :) –

0

Une solution consiste à générer des fourchettes de prix de façon dynamique. Voici comment vous pouvez le faire:

Supposons que vous avez 100 produits.

  • Trier tous les produits dans l'ordre croissant.
  • 10% produits dans la première gamme de prix - Choisissez parmi les 10 premiers produits. Gamme de prix = 1er - 10ème produit.
  • Subséquente 25% dans la 2ème gamme de prix - Choisissez Prochain 25 produits. Gamme de prix 11ème - 35ème produit.
  • Subséquent 25% dans la 3eme gamme de prix - Choisissez Prochain 25 produits. Gamme de prix 36th - 60th Product.

Et ainsi de suite.

0

Vous pouvez utiliser la fonction de fenêtrage NTILE pour regrouper le produit dans les fourchettes de prix selon les besoins. Une approche consiste à diviser les produits en 20 seaux en fonction du prix (chaque seau avec 5%). Ensuite, les godets 1-2 seront d'abord 10%, 3-7 ensuite 25% et ainsi de suite.

Voir ci-dessous un échantillon SQL basé sur la table des produits de base de données AVDW

select englishproductname,listprice, 
case 
when nt between 1 and 2 then 1 
when nt between 3 and 7 then 2 
when nt between 8 and 12 then 3 
when nt between 13 and 17 then 4 
when nt between 18 and 20 then 5 
    end as range 
    from(
select englishproductname,listprice, 
    ntile(20) over(order by listprice) as nt 
from dbo.dimproduct) as prd 
+0

Merci josephj. Je vais l'utiliser si j'ai besoin de la gamme et des produits ensemble. Mais dans mon cas, seules les plages sont nécessaires. – Mint