2010-12-15 2 views
1

Dies ist für E-Commerce-Website. Wenn ein Kunde derzeit auf eine Kategorie klickt, findet die Anwendung den Höchstpreis und den Mindestpreis von Produkten innerhalb dieser Kategorie, dividiert die Differenz durch 5 (nur 5 Preisbereiche werden benötigt) und gruppiert die Produkte dann nach festgelegten Preisspannen.T-sql: Wie kann ein Preisbereich basierend auf der Kategorie dynamisch erstellt werden?

Das Problem ist, wenn 90% der Produkte rund $ 50 sind, aber nur wenige Produkte sind um $ 3000, dann werden die meisten Produkte in der ersten Reihe gruppiert werden, und nachfolgende Bereiche zeigt nur wenige Artikel. Dies wird den Zweck von Preisspannen besiegen.

Ideale Lage ist, Anwendungsanzeige Preisklassen nach Produkten Bevölkerung, wie:

  • ersten 10% der Produkte in der 1. Preisklasse
  • Nachfolgende 25% im 2. Preisklasse
  • Nachfolgende 25% in 3nd Preisklasse
  • Nachfolgende 25% in 4nd Preisklasse
  • Last 15% im fünften Preisklasse

aber Min- und Max-Wert jeder Preisklasse ist von Kategorie zu Kategorie unterschiedlich.

Kann dies in 1 Speicherprozedur (SQL Express 2008) durchgeführt werden? Irgendwelche Ideen?

Danke in fortgeschrittenem.

+0

Wo Sie von Preiskategorien erhalten Sie? Und fügen Sie bitte Tabelle Schema + einige Daten auch hinzu – gbn

+1

, wenn die meisten Produkte Preis haben über 50 $ macht es Sinn, Preisspanne zu machen? Wenn Sie Preisspanne wie 49.50-49.80 49.81-49.99 50.00-50.50 50.51-50.99 51.00-5000 haben, macht es keinen Sinn für meine. Ist es das, was du willst? – Dainius

+0

gbn: Preisbereiche werden dynamisch generiert, basierend auf dem Mindestpreis und dem Höchstpreis der Produkte innerhalb dieser Kategorie. – Mint

Antwort

1

Mischen TOP PERCENT und zuvor gefundenen Bereichen würde die fünf Preisspannen ergeben.

SQL-Anweisung

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 

Testdaten

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

Danke Lieven. :) – Mint

+0

Zum ersten Mal überhaupt konnte ich * die PERCENT-Syntax verwenden * also danke :) –

0

Eine Lösung besteht darin, Preisbereiche dynamisch zu generieren. Dies ist, wie Sie es tun können:

Nehmen wir an, Sie haben 100 Produkte.

  • Sortieren Sie alle Produkte in aufsteigender Reihenfolge.
  • 10% Produkte in der ersten Preisklasse - Wählen Sie die Top 10 Produkte aus. Preisspanne = 1. - 10. Produkt.
  • Weitere 25% in der 2. Preisklasse - Wählen Sie die nächsten 25 Produkte. Preisspanne 11. - 35. Produkt.
  • Weitere 25% in der 3. Preisklasse - Wählen Sie die nächsten 25 Produkte. Preisbereich 36. - 60. Produkt.

Und so weiter.

0

Sie können die NTILE Windowing-Funktion Gruppe nach Bedarf verwenden Sie das Produkt in den Preisklassen. Ein Ansatz besteht darin, die Produkte basierend auf dem Preis in 20 Eimer zu zerlegen (jeder Eimer mit 5%). Dann werden die Buckets 1-2 zuerst 10%, 3-7 die nächsten 25% und so weiter.

Siehe unten eine Probe SQL basierend auf AVDW Datenbankprodukte Tabelle

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

Danke josephj. Ich werde das verwenden, wenn ich die Auswahl und die Produkte zusammen brauche. Aber in meinem Fall werden nur Bereiche benötigt. – Mint

Verwandte Themen