TL;DR
SQL is the language for retrieving and storing data in relational databases. Both SAP SuccessFactors IM (SAP HANA Database) and Callidus Commissions (Oracle Database) are built on SQL.
Everything you see in ICM screens — participants, compensation plans, results, quotas — is stored in tables, accessed via SQL queries.
You don't need to be a developer to write SQL. You need to know SELECT (read data), WHERE (filter), and JOIN (combine tables) to solve 90% of real ICM problems.

The Problem SQL Solves

Imagine you're an Incentive Compensation Manager at a mid-size enterprise. Your sales team is complaining that their Q1 2026 commissions are missing. You log into SAP SuccessFactors Incentive Management and start clicking through screens to find the data. You check participant records, filter by plan, check the results table, cross-reference compensation plans. After 30 minutes, you've manually checked 20 participants and found the issue: a data upload failed for a specific region, so their results never processed.

Now imagine if you could ask the database: "Show me all participants in the Northwest region who should have results in Q1 2026 but don't, ordered by expected earnings." That's SQL. It takes your question and transforms it into a precise data request that the database answers in milliseconds.

SQL is a language — not a programming language, but a query language. Its job is simple: let you describe what data you want, and the database finds it for you. You don't tell the computer how to search (which is what programming languages do). You describe what you want, and the database engine figures out the "how."

Why SAP SuccessFactors IM and Callidus Commissions Both Use SQL

Let's zoom out. SAP SuccessFactors Incentive Management (ICM) runs on SAP HANA Database. Callidus Commissions runs on Oracle Database. Both are relational databases. This means:

  • All data is stored in tables (think: spreadsheets, but with enforced rules)
  • Each row represents one record (one participant, one compensation plan, one result)
  • Each column represents an attribute (NAME, PARTICIPANT_ID, RESULT_AMOUNT, etc.)
  • Tables are connected via relationships (a participant ID in the RESULTS table points back to the PARTICIPANT table)

Both systems store the same kinds of data:

Data Type SAP SuccessFactors IM Table Callidus Commissions Table
Participants CSC_PARTICIPANT CS_PARTICIPANT
Compensation Plans CSC_COMP_PLAN CS_COMP_PLAN
Results / Earnings CSC_RESULTS CS_RESULTS
Quotas CSC_QUOTA CS_QUOTA
Commissions Paid CSC_COMMISSION CS_COMMISSION
Period / Cycle Definitions CSC_PERIOD CS_PERIOD

Notice the pattern: SAP SuccessFactors IM uses CSC_ prefix (Callidus SuccessFactors Commissions), and Callidus uses CS_ prefix. The table structures and column names are almost identical. Learn SQL on one system, and you can query the other immediately.

SQL is the language that queries these tables. Without SQL, you're stuck clicking through UI screens, reading one record at a time, unable to see patterns or aggregate results.

SELECT: The Fundamental Operation

SQL has four core operations:

  • SELECT — Read data from a table
  • INSERT — Add new rows to a table
  • UPDATE — Change existing data in a table
  • DELETE — Remove rows from a table

As an ICM practitioner, 95% of your SQL work is SELECT. You read, filter, summarize, and analyze data. The write operations (INSERT, UPDATE, DELETE) are handled by the ICM application itself, not by hand-written SQL. We'll focus entirely on SELECT.

Here's your first SQL statement, explained line by line:

SQL — SAP SuccessFactors IM (SAP HANA Database)
SELECT *
FROM CSC_PARTICIPANT;

Breaking this down:

  • SELECT — "I want to retrieve data"
  • * — "All columns"
  • FROM — "from this table"
  • CSC_PARTICIPANT — the participant table in SAP SuccessFactors IM

This query returns every row and every column in the CSC_PARTICIPANT table. In Callidus Commissions, the same query would be:

SQL — Callidus Commissions (Oracle Database)
SELECT *
FROM CS_PARTICIPANT;

Identical syntax, different table name. That's the pattern you'll see throughout this learning path.

What You Can Do With SELECT

SELECT is powerful because you can layer conditions and operations on top of it:

SQL — Real ICM query
SELECT
  PARTICIPANT_ID,
  NAME,
  STATUS
FROM   CSC_PARTICIPANT
WHERE  STATUS = 'ACTIVE'
  AND   COUNTRY = 'US'
ORDER BY NAME ASC;

This query:

  • Picks specific columns: You only get PARTICIPANT_ID, NAME, and STATUS (not every column)
  • Filters rows: WHERE STATUS = 'ACTIVE' AND COUNTRY = 'US' means only US-based active participants
  • Sorts results: ORDER BY NAME ASC sorts alphabetically by name

In less than a second, the database finds all US-based active participants, retrieves their three columns, and sorts them by name. Try doing that manually on 50,000 participants.

JOINs: Combining Tables

SAP SuccessFactors IM and Callidus Commissions store data across multiple tables. Participants are in one table. Results are in another. Compensation plans are in a third. SQL lets you combine them.

Here's a real question: "What is the total earned amount for each participant in Q1 2026?" To answer this:

  • You need the PARTICIPANT table (to get names)
  • You need the RESULTS table (to get earnings amounts)
  • You need a way to connect participants to their results

That connection is a JOIN. A JOIN combines rows from two tables based on a matching condition:

SQL — SAP SuccessFactors IM
SELECT
  p.NAME,
  p.PARTICIPANT_ID,
  SUM(r.RESULT_AMOUNT) AS TOTAL_EARNED
FROM     CSC_PARTICIPANT p
JOIN     CSC_RESULTS    r ON r.PARTICIPANT_ID = p.PARTICIPANT_ID
WHERE    r.PERIOD_ID = '2026-Q1'
GROUP BY p.NAME, p.PARTICIPANT_ID
ORDER BY TOTAL_EARNED DESC;

This introduces new concepts (GROUP BY, aggregate functions like SUM, aliases like p and r) that we'll dive into in later lessons. For now, the key insight: the JOIN connects the PARTICIPANT table to the RESULTS table using the condition r.PARTICIPANT_ID = p.PARTICIPANT_ID. This says: "Match rows from the RESULTS table where the PARTICIPANT_ID matches rows in the PARTICIPANT table."

SELECT vs DML: Read vs Write

SQL has two broad categories of operations:

  • SELECT (DML Read): Retrieves data. No risk of damage. Safe to run on production.
  • INSERT, UPDATE, DELETE (DML Write): Modifies data. High risk. Never run on production without approval.
⚠️In this learning path, we write only SELECT statements. If you ever see an UPDATE or DELETE query, pause. Verify it with your DBA or team lead before running it. A single UPDATE without a WHERE clause can corrupt entire datasets.

SELECT is your safe zone. You cannot accidentally break data by reading it. This is why many ICM practitioners get SELECT access to production databases — they can investigate issues without risk.

Why This Matters for You

Here's why SQL is essential for ICM work:

  • Debugging: When a commission is missing, you can write a query to check if the data exists in the database or if the calculation itself failed
  • Validation: Before kicking off a compensation period, query the data to ensure all participants, plans, and quotas are loaded correctly
  • Auditing: When someone asks, "Did this person get paid?", you can prove it with a query instead of guessing
  • Reporting: Sophisticated ICM reporting often requires custom queries that the UI can't produce
  • Migration: When moving from Callidus Commissions to SAP SuccessFactors IM (or vice versa), validation queries are critical
  • Efficiency: Answering a data question takes seconds with SQL. Manually checking records takes hours.

You don't need to write complex queries. The next lessons will teach you the patterns you'll actually use in production. You're not training to be a database administrator. You're training to be an ICM practitioner who understands data.

SAP HANA vs Oracle: The Same Foundation

We mentioned that SAP SuccessFactors IM uses SAP HANA Database and Callidus Commissions uses Oracle Database. Don't let that intimidate you. The foundational SELECT syntax is identical on both:

Concept SAP HANA Database Oracle Database
Basic SELECT SELECT * FROM table; SELECT * FROM table;
WHERE clause WHERE col = 'value' WHERE col = 'value'
JOIN JOIN table2 ON cond JOIN table2 ON cond
GROUP BY GROUP BY col1, col2 GROUP BY col1, col2

You'll write one SELECT statement and run it on both systems without modification. The differences matter when you get into advanced territory (window functions, procedural SQL), and we'll call them out explicitly. For now, what you learn applies to both.

What Comes Next

In Lesson 02, we'll build on this foundation. You'll learn:

  • How to select specific columns instead of all columns (*)
  • The WHERE clause and its operators (=, !=, >, <, BETWEEN, IN, LIKE)
  • NULL handling and why it's critical in ICM
  • ORDER BY and LIMIT to control result sets
  • AND/OR logic to combine multiple conditions

By the end of Lesson 02, you'll be able to write production-ready queries to filter participants, find missing data, and validate compensation plans.