2013-10-25 21 views
0

當我試圖執行以下查詢它給了我正確的結果,但我想說明的範圍內動態MySQL的 - 用戶的總積分在不同範圍內計算與動態範圍

SELECT 
CASE 
WHEN points <= 25 THEN '0-25' 
WHEN points BETWEEN 25 AND 50 THEN '25-50' 
WHEN points BETWEEN 50 AND 75 THEN '50-75' 
WHEN points BETWEEN 75 AND 100 THEN '75-100' 
ELSE '> 100' 
END AS `Range` 
,COUNT(*) AS `Count` 
,CASE 
WHEN points <= 25 THEN 1 
WHEN points BETWEEN 25 AND 50 THEN 2 
WHEN points BETWEEN 50 AND 75 THEN 3 
WHEN points BETWEEN 75 AND 100 THEN 4 
ELSE 5 
END AS `Sort` 
FROM (
SELECT user_id, SUM(points) as points 
FROM tbl 
GROUP BY user_id 
) AS summary 
GROUP BY `Range`, `Sort` 

輸出

+--------+-------+ 
| Range | Count | 
+--------+-------+ 
| 0-20 | 01 | 
| 25-50 | 02 | 
| 50-75 | 01 | 
| 75-100 | 04 | 
| > 100 | 00 | 
+--------+-------+ 

我從另一個表中得到下列值的100值

SELECT MIN(points)FROM tbl1 where 1 LIMIT 0,1

如果最小值將是100然後輸出將是:

輸出

+--------+-------+ 
| Range | Count | 
+--------+-------+ 
| 0-20 | 01 | 
| 25-50 | 02 | 
| 50-75 | 01 | 
| 75-100 | 04 | 
| > 100 | 00 | 
+--------+-------+ 

如果最小值將是500然後輸出將是:

輸出

+---------+-------+ 
| Range | Count | 
+---------+-------+ 
| 0-100 | 01 | 
| 100-200 | 02 | 
| 300-400 | 01 | 
| 400-500 | 04 | 
| > 500 | 00 | 
+---------+-------+ 

在此先感謝

回答

1
SELECT CASE WHEN points <= range1 THEN CONCAT('0-', range1) 
      WHEN points <= range2 THEN CONCAT(range1, '-', range2) 
      WHEN points <= range3 THEN CONCAT(range2, '-', range3) 
      WHEN points <= range4 THEN CONCAT(range3, '-', range4) 
      ELSE CONCAT('> ', range4) 
     END AS `Range` 
     ,COUNT(*) AS `Count` 
     ,LEAST(5, GREATEST(1, CEIL(points/range1))) AS Sort 
FROM (SELECT user_id, SUM(points) as points 
     FROM tbl 
     GROUP BY user_id 
    ) AS summary 
JOIN (SELECT FLOOR(MIN(points)*.25) range1, FLOOR(MIN(points)*.50) range2, FLOOR(MIN(points)*.75) range3, MIN(points) range4 FROM tbl1) x 
GROUP BY `Range`, `Sort` 

請注意,您不需要在WHEN條款使用BETWEEN。這些子句按順序測試,所以如果它通過points <= 25,它必須大於25,並且沒有必要在下一個子句中明確地測試它。

+0

當我的最小值是500時,它仍然顯示範圍如0-25,25-50它應該是0-100,100-200 –

+0

我只是在我的乘數中修正了一個錯誤,但那不能解釋你的結果。你不可能從我的代碼中獲得類似的範圍。你可以做一個sqlfiddle嗎? – Barmar

+0

我很困惑你的例子。當最小值爲100時,你上升了1/4,但當最小值爲500時,你上升1/5。但是你錯過了200-300的範圍。 – Barmar