2017-10-09 3 views
0

Ich habe einige Probleme mit meiner Abfrage, um ein Ranking-System zu erstellen. Meine Abfrage ist gut, aber ich verwende eine Variable, und die Ergebnisse sind inkonsistent.Erstellen Sie ein Ranking-System in SQL, Variablen Probleme

Die erste Fallanweisung ist gut, aber nicht die zweite. Hatte ich eine Möglichkeit, dieses zweite Kalkül ohne Verwendung der Variable zu machen?

 CASE 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) BETWEEN 0 AND 100 AND DATEDIFF(NOW(),MAX(pso.date_add))  BETWEEN 0 AND 50  THEN @scoring := ROUND(50 + SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) BETWEEN 0 AND 100 AND DATEDIFF(NOW(),MAX(pso.date_add))  BETWEEN 51 AND 150  THEN @scoring := ROUND(20 + SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) BETWEEN 0 AND 100 AND DATEDIFF(NOW(),MAX(pso.date_add))  BETWEEN 151 AND 364  THEN @scoring := ROUND(SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) BETWEEN 0 AND 100 AND DATEDIFF(NOW(),MAX(pso.date_add))  >= 365     THEN @scoring := ROUND(SUM(pso.total_products_wt)/COUNT(pso.total_products_wt)/20 + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) BETWEEN 101 AND 499 AND DATEDIFF(NOW(),MAX(pso.date_add))  BETWEEN 0 AND 50  THEN @scoring := ROUND(50 + SUM(pso.total_products_wt)/COUNT(pso.total_products_wt)/3 + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) BETWEEN 101 AND 499 AND DATEDIFF(NOW(),MAX(pso.date_add))  BETWEEN 51 AND 150  THEN @scoring := ROUND(20 + SUM(pso.total_products_wt)/COUNT(pso.total_products_wt)/3 + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) BETWEEN 101 AND 499 AND DATEDIFF(NOW(),MAX(pso.date_add))  BETWEEN 151 AND 364  THEN @scoring := ROUND(SUM(pso.total_products_wt)/COUNT(pso.total_products_wt)/3 + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) BETWEEN 101 AND 499 AND DATEDIFF(NOW(),MAX(pso.date_add))  >= 365     THEN @scoring := ROUND(SUM(pso.total_products_wt)/COUNT(pso.total_products_wt)/20 + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) >= 500 AND DATEDIFF(NOW(),MAX(pso.date_add))     BETWEEN 0 AND 50  THEN @scoring := ROUND(50 + SUM(pso.total_products_wt)/COUNT(pso.total_products_wt)/5 + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) >= 500 AND DATEDIFF(NOW(),MAX(pso.date_add))     BETWEEN 51 AND 150  THEN @scoring := ROUND(20 + SUM(pso.total_products_wt)/COUNT(pso.total_products_wt)/5 + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) >= 500 AND DATEDIFF(NOW(),MAX(pso.date_add))     BETWEEN 151 AND 364  THEN @scoring := ROUND(SUM(pso.total_products_wt)/COUNT(pso.total_products_wt)/5 + COUNT(pso.id_order)*10,0) 
      WHEN SUM(pso.total_products_wt)/COUNT(pso.total_products_wt) >= 500 AND DATEDIFF(NOW(),MAX(pso.date_add))     >= 365     THEN @scoring := ROUND(SUM(pso.total_products_wt)/COUNT(pso.total_products_wt)/20 + COUNT(pso.id_order)*10,0) 
     END AS 'Scoring', 
     CASE 
      WHEN @scoring >= 200 THEN '5/5' 
      WHEN @scoring BETWEEN 150 AND 199 THEN '4/5' 
      WHEN @scoring BETWEEN 100 AND 149 THEN '3/5' 
      WHEN @scoring BETWEEN 50 AND 99 THEN '2/5' 
      WHEN @scoring <= 49 THEN '1/5' 
     END AS 'Rank' 
+0

Cay Sie versuchen, 'erstellen function' https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html – bato3

Antwort

1

Aus der Dokumentation https://dev.mysql.com/doc/refman/5.5/en/user-variables.html:

jedoch Benutzervariablen die Reihenfolge der Auswertung für Ausdrücke, die ist nicht definiert.

Also in Ihrem zweiten Ausdruck kann man die Variable @scoring rechts nach liest es durch den ersten Ausdruck modifiziert worden ist (wie erwartet), oder genau richtig vor dass.

Lösung:

SELECT 
    "Scoring", 
    CASE 
     WHEN "Scoring" >= 200 THEN '5/5' 
     WHEN "Scoring" BETWEEN 150 AND 199 THEN '4/5' 
     WHEN "Scoring" BETWEEN 100 AND 149 THEN '3/5' 
     WHEN "Scoring" BETWEEN 50 AND 99 THEN '2/5' 
     WHEN "Scoring" <= 49 THEN '1/5' 
    END AS "Rank" 
FROM 
(
    SELECT 
    ... 
    CASE WHEN ... END AS "Scoring" 
    ... 
    FROM pso 
    ... 
) subquery 
+0

Dank für die Informationen @thorsten, Es gibt noch einen anderen Weg? – Paul

+0

Ja, wählen Sie in zwei Schritten. Sie brauchen überhaupt keine Variable. Wählen Sie zuerst "Scoring" aus und verwenden Sie dann Ihre Abfrage als Unterabfrage, die Sie erneut auswählen, indem Sie "Scoring" zum Berechnen von "Rank" verwenden. Ich habe meine Antwort aktualisiert. –

+0

Es ist Arbeit :) Danke @Thorsten – Paul

Verwandte Themen