2017-10-09 8 views
0

ランキングシステムを作成するために私のクエリにいくつか問題があります。 私のクエリは良いですが、私はいくつかの変数を使用しており、結果は矛盾しています。ランク付けシステムをSQLで作成する、変数問題

最初のcaseステートメントは良好ですが、2番目のステートメントは良好です。私は変数を使用せずにこの2番目の計算をする可能性を持っていましたか?ドキュメントhttps://dev.mysql.com/doc/refman/5.5/en/user-variables.htmlから

 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

ケイあなたはfunction' https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html @thorsten情報について – bato3

答えて

1

ただし、ユーザー変数を含む式の評価順序は未定義です。

だからあなたの第二の発現にあなたは右後にそれがその前に、最初の式(期待どおり)によって変更、またはちょうどされています変数@scoringを読むことができます。

ソリューション:

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

感謝を作成し 'てみてください、もう一つの方法がありますか? – Paul

+0

はい、2つのステップで選択してください。変数はまったく必要ありません。最初に「スコアリング」を選択し、次に「ランク」を計算するために「スコアリング」を使用して選択したサブクエリとしてクエリを使用します。私は私の答えを更新しました。 –

+0

それは仕事です:)ありがとう@Thorsten – Paul

関連する問題