การรายงานข้อมูลซ้ำ

การรายงานผลด้วย SQL

Tyler Pernes

Learning & Development Consultant

สาเหตุของข้อมูลซ้ำ?

การรายงานผลด้วย SQL

สาเหตุของข้อมูลซ้ำ?

SELECT p.id, SUM(points) AS points, SUM(matches_win) AS matches_won
FROM points AS p
JOIN matches AS m ON p.id = m.id
GROUP BY p.id;
การรายงานผลด้วย SQL

สาเหตุของข้อมูลซ้ำ?

+-----+--------+--------------+
| id  | points | matches_won  |
|-----|--------|--------------|
| 1   | 156    | 10           |
+-----+--------+--------------+
1 ส่งผลให้ค่า points มีค่าเป็นสามเท่าของที่ควรเป็น ในกรณีนี้คือ 156
การรายงานผลด้วย SQL

สาเหตุของข้อมูลซ้ำ?

Intermediate Table
+-----+------+--------------+---------+ 
| id  | year | matches_won  | points  |
|-----|------|--------------|---------|    
| 1   | 2016 | 5            | 52      |
| 1   | 2017 | 2            | 52      |  
| 1   | 2018 | 3            | 52      |
+-----+------+--------------+---------+
การรายงานผลด้วย SQL

สาเหตุของข้อมูลซ้ำ?

Intermediate Table
+-----+------+--------------+---------+ 
| id  | year | matches_won  | points  |
|-----|------|--------------|---------|    
| 1   | 2016 | 5            | 52      | <--
| 1   | 2017 | 2            | 52      | <-- SUM(points) = 52 x 3 = 156
| 1   | 2018 | 3            | 52      | <-- 
+-----+------+--------------+---------+    
การรายงานผลด้วย SQL

วิธีแก้ไขข้อมูลซ้ำ

1. ลบการรวมข้อมูล (aggregation)

SELECT p.id, points, SUM(matches_won) AS matches_won
FROM points AS p
JOIN matches AS m ON p.id = m.id
GROUP BY p.id, points;
+-----+--------+--------------+
| id  | points | matches_won  |
|-----|--------|--------------|
| 1   | 52     | 10           |
+-----+--------+--------------+
การรายงานผลด้วย SQL

วิธีแก้ไขข้อมูลซ้ำ

การรายงานผลด้วย SQL

วิธีแก้ไขข้อมูลซ้ำ

2. เพิ่มฟิลด์ในคำสั่ง JOIN

SELECT p.id, SUM(points) AS points, SUM(matches_win) AS matches_won
FROM points AS p
JOIN matches AS m ON p.id = m.id AND p.year = m.year
GROUP BY p.id;
การรายงานผลด้วย SQL

วิธีแก้ไขข้อมูลซ้ำ

2. เพิ่มฟิลด์ในคำสั่ง JOIN

SELECT p.id, SUM(points) AS points, SUM(matches_win) AS matches_won
FROM points AS p
JOIN matches AS m ON p.id = m.id AND p.year = m.year
GROUP BY p.id;
การรายงานผลด้วย SQL

วิธีแก้ไขข้อมูลซ้ำ

SELECT id, SUM(matches_won)
FROM matches
GROUP BY id;
+-----+--------------+
| id  | matches_won  |
|-----|--------------|
| 1   | 10           |
| 2   | 7            |
+-----+--------------+
การรายงานผลด้วย SQL

วิธีแก้ไขข้อมูลซ้ำ

3. รวมข้อมูลด้วย subquery

SELECT p.id, points, matches_won
FROM points AS p
JOIN 
    (SELECT id, SUM(matches_won) AS matches_won
    FROM matches
    GROUP BY id) AS m 
ON p.id = m.id;
การรายงานผลด้วย SQL

วิธีแก้ไขข้อมูลซ้ำ

  1. ลบการรวมข้อมูล (aggregation)
  2. เพิ่มฟิลด์ในคำสั่ง JOIN
  3. รวมข้อมูลด้วย subquery
การรายงานผลด้วย SQL

การระบุข้อมูลซ้ำ

ค่าในตารางต้นฉบับ:

SELECT SUM(points) AS total_points
FROM points;
total_points = 52

ค่าจากคิวรี:

SELECT SUM(points) AS total_points
FROM   
    (SELECT p.id, SUM(points) AS points
    FROM points AS p
    JOIN matches AS m ON p.id = m.id
    GROUP BY p.id) AS subquery;
total_points = 156
การรายงานผลด้วย SQL

เป้าหมายของบท

การรายงานผลด้วย SQL

มาฝึกกันเถอะ!

การรายงานผลด้วย SQL

Preparing Video For Download...