0

次のクエリを実行しようとすると、適切な結果が得られますが、範囲を動的に表示したい

 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    |
+---------+-------+

前もって感謝します

4

1 に答える 1

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`

句で使用BETWEENする必要がないことに注意してください。WHEN句は順番にテストされるため、 をpoints <= 25超える場合は より大きい必要があり25、次の句で明示的にテストする必要はありません。

于 2013-10-25T06:31:38.530 に答える