ทำความสะอาดข้อมูลก่อน Aggregate: ลบ Currency Symbol
เมื่อคอลัมน์เก็บราคาเป็น String ที่มี Currency Sign (€, $, ฿, USD) ต้องลบ Sign ออกก่อนจึงจะ SUM ได้
ตัวอย่าง
CREATE TABLE DemoTable616 (Price VARCHAR(100));
INSERT INTO DemoTable616 VALUES
('€200.00'), ('€300.00'), ('€500.00');
Query: ลบ € แล้ว SUM
SELECT SUM(REPLACE(Price, '€', '')) AS Total_Price
FROM DemoTable616;
ผลลัพธ์: 1000
REPLACE Function
REPLACE(str, from_str, to_str)
-- แทนที่ from_str ทุกที่ใน str ด้วย to_str
กรณีซับซ้อน: หลาย Currency, Comma, Space
-- ข้อมูล: '$1,234.56', '€ 99.00', 'THB 1,500', 'USD 2500.00'
SELECT SUM(
CAST(
REPLACE(
REPLACE(
REPLACE(REPLACE(Price, '$', ''), '€', ''),
'THB', ''),
',', ''
) AS DECIMAL(15,2)
)
) AS total_usd
FROM prices;
Best Practice: แยก Column
| Design | Columns | ข้อดี |
|---|---|---|
| Bad | Price VARCHAR('€200.00') | Query ซับซ้อน, Slow, Error-prone |
| Good | Amount DECIMAL(10,2), Currency CHAR(3) | Index ได้, คำนวณเร็ว, Standard |
| Better | Amount_cents BIGINT, Currency CHAR(3) | No Floating Point Error, เร็วที่สุด |
MySQL 8.0: Generated Column สำหรับ Clean Value
ALTER TABLE DemoTable616
ADD COLUMN Price_Clean DECIMAL(10,2)
GENERATED ALWAYS AS (CAST(REPLACE(Price, '€', '') AS DECIMAL(10,2))) STORED,
ADD INDEX idx_price_clean (Price_Clean);
-- แล้ว Query เร็ว:
SELECT SUM(Price_Clean) FROM DemoTable616;
Currency Formatting สำหรับแสดงผล
-- Format เป็น Currency String
SELECT CONCAT('€', FORMAT(SUM(REPLACE(Price, '€', '')), 2)) AS formatted_total
FROM DemoTable616;
-- ผล: €1,000.00
-- ใช้ FORMAT() พร้อม Locale (MySQL 8.0+)
SELECT FORMAT(1000, 2, 'de_DE'); -- 1.000,00 (German)