Trùng lặp báo cáo

Lập báo cáo trong SQL

Tyler Pernes

Learning & Development Consultant

Nguyên nhân gây trùng lặp?

Lập báo cáo trong SQL

Nguyên nhân gây trùng lặp?

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;
Lập báo cáo trong SQL

Nguyên nhân gây trùng lặp?

+-----+--------+--------------+
| id  | points | matches_won  |
|-----|--------|--------------|
| 1   | 156    | 10           |
+-----+--------+--------------+
1 sẽ cho ra giá trị points gấp ba lần thực tế, ở đây là 156.
Lập báo cáo trong SQL

Nguyên nhân gây trùng lặp?

Bảng trung gian
+-----+------+--------------+---------+ 
| id  | year | matches_won  | points  |
|-----|------|--------------|---------|    
| 1   | 2016 | 5            | 52      |
| 1   | 2017 | 2            | 52      |  
| 1   | 2018 | 3            | 52      |
+-----+------+--------------+---------+
Lập báo cáo trong SQL

Nguyên nhân gây trùng lặp?

Bảng trung gian
+-----+------+--------------+---------+ 
| id  | year | matches_won  | points  |
|-----|------|--------------|---------|    
| 1   | 2016 | 5            | 52      | <--
| 1   | 2017 | 2            | 52      | <-- TỔNG(points) = 52 x 3 = 156
| 1   | 2018 | 3            | 52      | <-- 
+-----+------+--------------+---------+    
Lập báo cáo trong SQL

Cách khắc phục trùng lặp

1. Bỏ tổng hợp

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           |
+-----+--------+--------------+
Lập báo cáo trong SQL

Cách khắc phục trùng lặp

Lập báo cáo trong SQL

Cách khắc phục trùng lặp

2. Thêm trường vào câu 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;
Lập báo cáo trong SQL

Cách khắc phục trùng lặp

2. Thêm trường vào câu 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;
Lập báo cáo trong SQL

Cách khắc phục trùng lặp

SELECT id, SUM(matches_won)
FROM matches
GROUP BY id;
+-----+--------------+
| id  | matches_won  |
|-----|--------------|
| 1   | 10           |
| 2   | 7            |
+-----+--------------+
Lập báo cáo trong SQL

Cách khắc phục trùng lặp

3. Tổng hợp bằng truy vấn con

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;
Lập báo cáo trong SQL

Cách khắc phục trùng lặp

  1. Bỏ tổng hợp
  2. Thêm trường vào câu JOIN
  3. Tổng hợp bằng truy vấn con
Lập báo cáo trong SQL

Xác định trùng lặp

Giá trị trong bảng gốc:

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

Giá trị trong truy vấn:

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
Lập báo cáo trong SQL

Mục tiêu chương

Lập báo cáo trong SQL

Đến giờ luyện tập!

Lập báo cáo trong SQL

Preparing Video For Download...