Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Hiển thị histogram có giá trị âm trong MySQL

Kỹ thuật

Dùng REPEAT() tạo chuỗi '*', RPAD() căn lề, REVERSE() đảo chuỗi để vẽ histogram âm (bên trái) và dương (bên phải).

Ví dụ

Tạo bảng:

CREATE TABLE DemoTable632 (
    histogramId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    histogramValue INT,
    histogramImage TEXT
);
INSERT INTO DemoTable632(histogramValue) VALUES
(2), (3), (-6), (-5);

Truy vấn histogram:

SELECT histogramId, histogramValue,
       CONCAT(
           REVERSE(RPAD(REPEAT('*', IF(histogramValue < 0, -histogramValue, 0)), 100, ' ')),
           REPEAT('*', IF(histogramValue < 0, 0, histogramValue))
       ) AS histogramImage
FROM DemoTable632
ORDER BY histogramId;

Kết quả:

+-------------+----------------+----------------+
| histogramId | histogramValue | histogramImage |
+-------------+----------------+----------------+
| 1           | 2              | **             |
| 2           | 3              | ***            |
| 3           | -6             | ******         |
| 4           | -5             | *****          |
+-------------+----------------+----------------+

Giải thích logic

  • Giá trị dương (≥0): REPEAT('*', value) → in * bên phải.
  • Giá trị âm (<0):
    • REPEAT('*', -value): Tạo chuỗi * cho giá trị tuyệt đối.
    • RPAD(..., 100, ' '): Đệm space đến độ dài 100 (căn phải).
    • REVERSE(...): Đảo chuỗi → * chuyển sang bên trái.
  • CONCAT gộp phần âm (bên trái) + phần dương (bên phải).

Cải tiến: Căn giữa zero point

SELECT histogramId, histogramValue,
       CONCAT(
           REVERSE(RPAD(REPEAT('*', IF(histogramValue < 0, -histogramValue, 0)), 50, ' ')),
           REPEAT(' ', 50 - IF(histogramValue > 0, histogramValue, 0)),
           REPEAT('*', IF(histogramValue > 0, histogramValue, 0))
       ) AS histogramImage
FROM DemoTable632;

Ứng dụng

  • Visualize dữ liệu trực tiếp trong SQL client (cli, terminal).
  • Quick data profiling, anomaly detection.
  • Reporting đơn giản không cần BI tool.