Technical
SQL Queries for Oracle Fusion HCM Reporting and Analysis
Essential SQL query patterns for extracting data from Oracle Fusion HCM for reporting and analysis
SQL queries enable powerful data extraction and analysis from Oracle Fusion HCM. Understanding key tables and query patterns is essential for custom reporting.
HCM Data Model
Core tables in HCM data model:
Person and Employee Tables
- PER_PERSONS: Personal information
- PER_EMPLOYEES: Employment records
- PER_ASSIGNMENTS: Job assignments
- PER_PERSON_NAMES: Name variations
Organization Tables
- PER_ORGANIZATION_STRUCTURES: Department hierarchy
- PER_ORG_STRUCTURE_VERSIONS: Organization changes over time
Compensation Tables
- PAY_PEOPLE_PAYMENT_METHOD: Payment setup
- PAY_PERSONAL_PAYMENT_METHOD: Personal payment details
Basic Query Structure
Simple query retrieving employee information:
SELECT pn.first_name, pn.last_name, pp.email_address
FROM per_persons pp
JOIN per_person_names pn ON pp.person_id = pn.person_id
WHERE pp.effective_date = TRUNC(SYSDATE)
Joining Key Tables
Retrieve comprehensive employee and assignment data:
SELECT
pn.first_name || ' ' || pn.last_name as employee_name,
pa.assignment_number,
pa.job_title,
pa.salary_basis
FROM per_employees pe
JOIN per_persons pp ON pe.person_id = pp.person_id
JOIN per_person_names pn ON pp.person_id = pn.person_id
JOIN per_assignments pa ON pe.employee_id = pa.employee_id
WHERE pe.effective_date = TRUNC(SYSDATE)
Date Effective Queries
Handle effective-dated data:
SELECT *
FROM per_assignments pa
WHERE pa.effective_date <= TRUNC(SYSDATE)
AND pa.effective_end_date > TRUNC(SYSDATE)
Organizational Hierarchy Queries
Retrieve reporting structure:
SELECT
mgr.first_name as manager_name,
emp.first_name as employee_name
FROM per_assignments emp_asgn
JOIN per_person_names emp ON emp_asgn.person_id = emp.person_id
JOIN per_assignments mgr_asgn ON emp_asgn.manager_id = mgr_asgn.assignment_id
JOIN per_person_names mgr ON mgr_asgn.person_id = mgr.person_id
Payroll Data Queries
Extract earnings and deductions:
SELECT
pn.first_name || ' ' || pn.last_name as employee_name,
peh.element_name,
peh.element_amount
FROM pay_element_history peh
JOIN per_employees pe ON peh.employee_id = pe.employee_id
JOIN per_persons pp ON pe.person_id = pp.person_id
JOIN per_person_names pn ON pp.person_id = pn.person_id
Time and Labor Queries
Retrieve timesheet data:
SELECT
pn.first_name || ' ' ' pn.last_name as employee_name,
tmc.measure_name,
tmc.measure_value
FROM time_measure_collections tmc
JOIN per_employees pe ON tmc.employee_id = pe.employee_id
JOIN per_persons pp ON pe.person_id = pp.person_id
JOIN per_person_names pn ON pp.person_id = pn.person_id
Aggregation Queries
Calculate summaries for reporting:
SELECT
department_name,
COUNT(DISTINCT pp.person_id) as headcount,
AVG(pa.salary_basis) as avg_salary
FROM per_assignments pa
JOIN per_persons pp ON pa.person_id = pp.person_id
GROUP BY pa.department_name
Performance Considerations
Optimize query performance:
- Use indexes on frequently filtered columns
- Filter early with WHERE clauses
- Avoid full table scans
- Use EXPLAIN PLAN for analysis
Common Query Pitfalls
Avoid these issues:
- Ignoring effective dates causes duplicates
- Forgetting to exclude terminated employees
- Not accounting for multiple assignments
- Cartesian products from improper joins
Best Practices
- Understand effective dating in HCM schema
- Use parameterized queries for flexibility
- Test with sample data before production
- Document query purpose for maintenance
- Monitor performance for large datasets
Conclusion
Well-crafted SQL queries unlock the full analytical potential of Oracle Fusion HCM. Master these patterns to create powerful custom reports and analysis.