Duplicatie in rapporten

Rapporteren in SQL

Tyler Pernes

Learning & Development Consultant

Waardoor ontstaat duplicatie?

Rapporteren in SQL

Waardoor ontstaat duplicatie?

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;
Rapporteren in SQL

Waardoor ontstaat duplicatie?

+-----+--------+--------------+
| id  | points | matches_won  |
|-----|--------|--------------|
| 1   | 156    | 10           |
+-----+--------+--------------+
1 zorgt voor een points-waarde die drie keer te hoog is: hier 156.
Rapporteren in SQL

Waardoor ontstaat duplicatie?

Tussentabel
+-----+------+--------------+---------+ 
| id  | year | matches_won  | points  |
|-----|------|--------------|---------|    
| 1   | 2016 | 5            | 52      |
| 1   | 2017 | 2            | 52      |  
| 1   | 2018 | 3            | 52      |
+-----+------+--------------+---------+
Rapporteren in SQL

Waardoor ontstaat duplicatie?

Tussentabel
+-----+------+--------------+---------+ 
| id  | year | matches_won  | points  |
|-----|------|--------------|---------|    
| 1   | 2016 | 5            | 52      | <--
| 1   | 2017 | 2            | 52      | <-- SOM(points) = 52 x 3 = 156
| 1   | 2018 | 3            | 52      | <-- 
+-----+------+--------------+---------+    
Rapporteren in SQL

Manieren om duplicatie op te lossen

1. Verwijder aggregaties

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           |
+-----+--------+--------------+
Rapporteren in SQL

Manieren om duplicatie op te lossen

Rapporteren in SQL

Manieren om duplicatie op te lossen

2. Voeg veld toe aan 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;
Rapporteren in SQL

Manieren om duplicatie op te lossen

2. Voeg veld toe aan 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;
Rapporteren in SQL

Manieren om duplicatie op te lossen

SELECT id, SUM(matches_won)
FROM matches
GROUP BY id;
+-----+--------------+
| id  | matches_won  |
|-----|--------------|
| 1   | 10           |
| 2   | 7            |
+-----+--------------+
Rapporteren in SQL

Manieren om duplicatie op te lossen

3. Rollup met 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;
Rapporteren in SQL

Manieren om duplicatie op te lossen

  1. Verwijder aggregaties
  2. Voeg veld toe aan JOIN
  3. Rollup met subquery
Rapporteren in SQL

Duplicatie herkennen

Waarde in originele tabel:

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

Waarde in query:

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
Rapporteren in SQL

Doel van de hoofdstuk

Rapporteren in SQL

Laten we oefenen!

Rapporteren in SQL

Preparing Video For Download...