What is SuiteQL?
SuiteQL (SuiteAnalytics Query Language) is a query language introduced by NetSuite that allows you to retrieve data using SQL-like syntax. It provides greater flexibility and performance compared to standard saved searches and N/query module in SuiteScript.
Why Use SuiteQL?
- Performance: Queries execute faster compared to saved searches.
- Advanced Joins: Supports complex joins across multiple tables.
- Aggregations & Filtering: Allows use of SQL functions like COUNT, SUM, GROUP BY, etc.
- Greater Data Access: Enables retrieval of fields that are not available in saved searches.
How to Use SuiteQL in SuiteScript
SuiteQL can be used in SuiteScript 2.x via the N/query module.
1. Basic SuiteQL Query Example
Fetching customer data:
javascript
Copy
Edit
define(['N/query'], function(query) {
    function executeSuiteQL() {
        var sqlQuery = `
            SELECT id, entityid, email, subsidiary 
            FROM customer 
            WHERE email IS NOT NULL 
            ORDER BY entityid ASC
        `;
        var resultSet = query.runSuiteQL({ query: sqlQuery });
        var results = resultSet.asMappedResults(); // Converts to JSON format
        log.debug('Customer Data:', results);
        return results;
    }
    return { executeSuiteQL: executeSuiteQL };
});
đź’ˇ Key Points:
- query.runSuiteQL()executes the SQL query.
- asMappedResults()converts the result into an array of objects.
2. Joining Multiple Tables
SuiteQL allows joining multiple tables, unlike saved searches.
Example: Fetching Sales Orders with Customer Details
javascript
Copy
Edit
var sqlQuery = `
    SELECT so.id AS sales_order_id, so.tranid, c.entityid AS customer_name, so.total 
    FROM transaction AS so 
    INNER JOIN customer AS c ON so.entity = c.id 
    WHERE so.type = 'SalesOrd' 
    ORDER BY so.trandate DESC
`;
var results = query.runSuiteQL({ query: sqlQuery }).asMappedResults();
log.debug('Sales Orders:', results);
3. Using Aggregations (SUM, COUNT, GROUP BY)
To get the total sales per customer:
javascript
Copy
Edit
var sqlQuery = `
    SELECT c.entityid AS customer_name, SUM(so.total) AS total_sales
    FROM transaction AS so
    INNER JOIN customer AS c ON so.entity = c.id
    WHERE so.type = 'SalesOrd' 
    GROUP BY c.entityid
`;
var results = query.runSuiteQL({ query: sqlQuery }).asMappedResults();
log.debug('Total Sales Per Customer:', results);
✔️ SuiteQL supports aggregate functions like SUM, COUNT, MAX, etc.
4. Filtering Data with WHERE Clause
Fetching invoices created in the last 30 days:
javascript
Copy
Edit
var sqlQuery = `
    SELECT id, tranid, total 
    FROM transaction 
    WHERE type = 'Invoice' AND trandate >= ADD_MONTHS(CURRENT_DATE, -1)
`;
var results = query.runSuiteQL({ query: sqlQuery }).asMappedResults();
log.debug('Recent Invoices:', results);
5. Handling Large Data Sets with LIMIT & OFFSET
NetSuite SuiteQL does not allow direct pagination, but you can use LIMIT and OFFSET for large queries.
javascript
Copy
Edit
var sqlQuery = `
    SELECT id, entityid, email 
    FROM customer 
    ORDER BY id ASC 
    LIMIT 100 OFFSET 200
`;
📌 LIMIT 100 OFFSET 200 retrieves records 201 to 300.