2012-04-04 10 views
2

Ich habe Boxen, die den gleichen Artikel in verschiedenen Größen enthalten.SQL-Abfrage zur Auswahl der Mindestanzahl von Boxen

Boxes    S M L XL XXL 

00001    2 4 4  
00002       4 2 
00003    8    
00004     8   
00005      8 8 
00006        8 
00007    1 2 2 2 2 
00008    1 2 2 2 
00009    2 4 4 4 2 
00010    3 5 4 4 2 
00011    2 3 4 4 2 

Nun, ich brauche das Modell in dieser Größe zu erhalten:

    S M L XL XXL 
        2 4 4 4 2 

Welche Boxen muss ich meine Notwendigkeiten decken?

I-Box verwenden könnte 00003, 00004, 00005, 00006, auf diese Weise, würde ich sammeln:

    S M L XL XXL 
        8 8 8 8 8 

aber viele Gegenstände verschwendet würde.

ich auch Boxen 00007, 00008 und erhalte nutzen könnte:

    S M L XL XXL 
        2 4 4 4 2 

Was mir, ich habe zu 2 Boxen bewegen, inzwischen 00009 BOX hat genau das, was ich brauche, mit minimun Aufwand paßt, aber trotzdem.

Zusammenfassend, was ist die minimale Anzahl von Boxen, die ich brauche, um meine Notwendigkeiten zu decken? Ich kann keinen Ausgangspunkt finden, um eine Abfrage oder eine Art Code zu erstellen, um dies zu lösen. Jede Hilfe wird geschätzt.

Vielen Dank im Voraus.

+1

Klingt ziemlich wie ein [bin Verpackungsproblem] (http://en.wikipedia.org/wiki/Bin_packing_problem). –

+0

Was ist dein DBMS? Gibt es auch Leistungseinschränkungen, die Sie erfüllen müssen? –

+0

Hallo, Das Fach Verpackung Probleme klingt gruselig, aber auch interessant. Ich habe einige Probleme in der Vergangenheit damit konfrontiert, so wird es für mich nützlich sein, danke kaiz.net. Branko, Ich benutze mysql und MS-Zugang als alternative Front-End. Keine Einschränkungen – Fran

Antwort

0

Folgendes wird auf SQL-Server funktionieren, um Ihr Problem zu lösen. Es funktioniert mit einem rekursiven CTE, um die Anzahl jeder Größe für ALLE Kombinationen von Boxen zu bestimmen (für eine große Anzahl von Boxen kann dies umständlich werden und die MAXRECURSION Änderung erfordern). Sie bestimmt dann, welche dieser Kombinationen die Kriterien der Mindestanzahl jeder Größe erfüllt, und ordnet dann die verbleibenden Kombinationen in der Reihenfolge der Anzahl der erforderlichen Kästchen an, und dann die Gesamtanzahl, die verschwendet wird, um die Mindestkriterien zu erfüllen. Durch Ändern der Reihenfolge in der RANK()-Funktion wird die Rangfolge der Lösungen geändert.

DECLARE @S INT = 2, 
     @M INT = 4, 
     @L INT = 4, 
     @XL INT = 4, 
     @XXL INT = 2 


CREATE TABLE #Boxes (Model VARCHAR(5), S INT, M INT, L INT, XL INT, XXL INT) 
INSERT #Boxes VALUES 
    ('00001', 2, 4, 4, 0, 0), 
    ('00002', 0, 0, 0, 4, 2), 
    ('00003', 8, 0, 0, 0, 0), 
    ('00004', 0, 8, 0, 0, 0), 
    ('00005', 2, 0, 8, 8, 0), 
    ('00006', 2, 0, 0, 0, 8), 
    ('00007', 1, 2, 2, 2, 2), 
    ('00008', 1, 2, 2, 2, 0), 
    ('00009', 2, 4, 4, 4, 2), 
    ('00010', 3, 5, 4, 4, 2), 
    ('00011', 2, 3, 4, 4, 2) 

;WITH CTE AS 
( SELECT *, CONVERT(VARCHAR(1000), Model + ';') [Models], 1 [Boxes] 
    FROM #Boxes 
    UNION ALL 
    SELECT a.Model, 
      a.S + b.S, 
      a.M + b.M, 
      a.L + b.L, 
      a.XL + b.XL, 
      a.XXL + b.XXL, 
      CONVERT(VARCHAR(1000), b.Models + a.Model + ';'), 
      Boxes + 1 
    FROM #Boxes a 
      INNER JOIN CTE b 
       ON a.Model > b.Model 
), CTE2 AS 
( SELECT Models, 
      S, 
      M, 
      L, 
      XL, 
      XXL, 
      Boxes, 
      (S + M + L + XL + XXL) - (@S + @M + @L + @XL + @XXL) [Wasted] 
    FROM CTE 
    WHERE S >= @S 
    AND  M >= @M 
    AND  L >= @L 
    AND  XL >= @XL 
    AND  XXL >= @XXL 
) 
SELECT *, 
     RANK() OVER(ORDER BY Boxes, Wasted) [Rank] 
FROM CTE2 

DROP TABLE #Boxes 
Verwandte Themen