Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL แสดง Histogram ด้วยดอกจัน (*) รองรับค่าลบ

สร้าง Histogram Text-based ใน SQL รองรับค่าลบ

ใช้ REPEAT() สร้างดอกจัน, RPAD() เติม Space, REVERSE() กลับด้านสำหรับค่าลบ

ตัวอย่าง: Histogram ด้วยค่าบวกและลบ

CREATE TABLE DemoTable632 (
    histogramId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    histogramValue INT,
    histogramImage TEXT
);

INSERT INTO DemoTable632(histogramValue) VALUES
(2), (3), (-6), (-5);

Query 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;

ผลลัพธ์:

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

อธิบาย Logic

  • ค่าบวก: REPEAT('*', value) แสดงดอกจันขวา
  • ค่าลบ: REPEAT('*', -value) สร้างดอกจัน แล้ว RPAD(..., 100, ' ') เติม Space ซ้าย 100 ช่อง, REVERSE() กลับด้าน → ดอกจันอยู่ซ้าย (แสดงค่าลบ)
  • IF(histogramValue < 0, ...) - แยก Logic ค่าบวก/ลบ

ปรับปรุง: Dynamic Width (ไม่ Hardcode 100)

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

Histogram แบบแนวตั้ง (Vertical) - Advanced

WITH RECURSIVE nums AS (
    SELECT 1 AS n UNION ALL SELECT n+1 FROM nums WHERE n < 10
),
data AS (
    SELECT histogramId, histogramValue FROM DemoTable632
)
SELECT 
    n AS level,
    GROUP_CONCAT(
        CASE 
            WHEN histogramValue >= n THEN '*'
            WHEN histogramValue <= -n THEN '*'
            ELSE ' '
        END ORDER BY histogramId SEPARATOR '  '
    ) AS bars
FROM nums
CROSS JOIN data
GROUP BY n
ORDER BY n DESC;

การใช้งานจริง

  • Quick Visualization ใน SQL Client (ไม่ต้อง Export ไป Excel)
  • Debug Data Distribution ใน Stored Procedure
  • Console/Terminal Report

Alternative: ใช้ Application Layer

สำหรับ Production Dashboard ให้ Query แค่ Aggregate แล้ว Chart ด้วย Chart.js, D3.js, Apache ECharts, หรือ BI Tools (Metabase, Superset, Grafana)