2017-10-09 1 views
0

순위 시스템을 만들 때 내 쿼리에 약간의 문제가 있습니다. 내 쿼리가 좋지만 일부 변수를 사용하고 결과가 일치하지 않습니다.SQL, 변수 문제로 순위 시스템 만들기

첫 번째 사례 문이 좋지만 두 번째 사례 문은 훌륭합니다. 변수없이이 두 번째 계산을 할 수 있습니까? 워드 프로세서 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

케이 당신이 정보가 @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

감사를 function' https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html 만들'시도 할 수있는 또 다른 방법이 있습니까? – Paul

+0

예, 두 단계로 선택하십시오. 변수가 전혀 필요 없습니다. 먼저 "Scoring"을 선택한 다음 "Rank"계산을 위해 "Scoring"을 사용하여 다시 선택한 하위 쿼리로 쿼리를 사용하십시오. 내 대답을 업데이트했습니다. –

+0

작품 : 고맙습니다 @ 토르스텐 – Paul