Od surowego zrzutu danych do gotowego raportu.
Case Study: Standaryzacja Globalnej Listy Płac.
Eksport z 3 różnych oddziałów firmy. Problemy: niespójne waluty, "śmieciowe" znaki w liczbach, błędy w pisowni nazwisk, braki w przypisaniu działów.
| ID | Employee_Name | Salary_Raw | Region | Dept |
|---|---|---|---|---|
| 1001 | jan kowalski | 5,000 $ | USA | IT Dev |
| 1002 | ANNA NOWAK | 20.000 pln | PL | NULL |
| 1003 | Pierre Dubois | 4.5k EUR | FR | Marketing |
| 1001 | jan kowalski | 5000 USD | USA | IT |
| 1004 | John Smith | TBD | UK | Sales |
Skrypt transformujący. Wykorzystuję CTE (Common Table Expressions) dla czytelności oraz funkcje okna do usuwania duplikatów.
/* Cel: Standaryzacja wynagrodzeń do PLN i czyszczenie danych osobowych.
Autor: Adam Klimczak
*/
WITH Raw_Cleaned AS (
SELECT
id,
-- 1. Naprawa formatowania tekstu (usuwanie spacji, Wielkie Litery)
INITCAP(TRIM(employee_name)) AS clean_name,
region,
-- 2. Uzupełnianie braków w działach
COALESCE(dept, 'Unassigned') AS dept_fixed,
-- 3. Logika wyciągania liczb z tekstu (np. '4.5k' -> 4500)
salary_raw,
CASE
WHEN salary_raw LIKE '%k%' THEN
CAST(REGEXP_REPLACE(salary_raw, '[^0-9.]', '') AS DECIMAL(10,2)) * 1000
WHEN salary_raw = 'TBD' THEN NULL
ELSE
CAST(REGEXP_REPLACE(salary_raw, '[^0-9.]', '') AS DECIMAL(10,2))
END AS salary_numeric,
-- Wykrywanie waluty na podstawie kolumny lub suffixu
CASE
WHEN salary_raw LIKE '%$%' OR region = 'USA' THEN 'USD'
WHEN salary_raw LIKE '%EUR%' OR region = 'FR' THEN 'EUR'
ELSE 'PLN'
END AS currency_detected,
-- 4. Funkcja okna do oznaczania duplikatów (bierzemy najnowszy rekord)
ROW_NUMBER() OVER(PARTITION BY id ORDER BY region DESC) as row_num
FROM raw_payroll_import
),
Final_Calculation AS (
SELECT
id,
clean_name,
dept_fixed,
-- 5. Przeliczenie wszystkiego na PLN (kursy sztywne dla demo)
CASE
WHEN currency_detected = 'USD' THEN salary_numeric * 3.95
WHEN currency_detected = 'EUR' THEN salary_numeric * 4.30
ELSE salary_numeric
END AS salary_pln_total
FROM Raw_Cleaned
WHERE row_num = 1 -- Odrzucamy duplikaty
AND salary_numeric IS NOT NULL -- Odrzucamy rekordy bez stawki (TBD)
)
SELECT * FROM Final_Calculation
ORDER BY salary_pln_total DESC;
Dane gotowe do analizy. Zwróć uwagę na ujednolicone nazwiska, przeliczone kwoty i brak duplikatów (Jan Kowalski występuje raz).
| ID | Clean_Name | Dept_Fixed | Salary_PLN (Total) | Data_Quality |
|---|---|---|---|---|
| 1002 | Anna Nowak | Unassigned | 20 000.00 | ✔ VERIFIED |
| 1001 | Jan Kowalski | IT Dev | 19 750.00 | ✔ DEDUPED |
| 1003 | Pierre Dubois | Marketing | 19 350.00 | ✔ CONVERTED |