Skip to main content

preview_sql

Returns the SQL query that would be executed for a given query without running it.


Description​

Useful for debugging, understanding query structure, or when you need to execute the SQL directly. Takes the same parameters as analytics_query but returns SQL instead of data.


Input Schema​

{
"type": "object",
"properties": {
"measures": {
"type": "array",
"items": { "type": "string" },
"description": "Array of measure names"
},
"dimensions": {
"type": "array",
"items": { "type": "string" },
"description": "Array of dimension names"
},
"filters": {
"type": "array",
"items": {
"type": "object",
"properties": {
"member": { "type": "string" },
"operator": { "type": "string" },
"values": { "type": "array", "items": { "type": "string" } }
}
},
"description": "Array of filter objects"
},
"timeDimensions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"dimension": { "type": "string" },
"granularity": { "type": "string" },
"dateRange": { "type": "array", "items": { "type": "string" } }
}
},
"description": "Time dimension settings"
},
"limit": {
"type": "number",
"description": "Maximum number of rows"
},
"order": {
"type": "object",
"description": "Sort order"
}
},
"required": []
}

Use Cases​

ScenarioWhy Use This Tool
DebuggingUnderstand how the semantic layer translates your query to SQL
Performance AnalysisExamine joins and aggregations
DocumentationInclude SQL in reports or documentation
Direct ExecutionRun the SQL in other tools (DBeaver, DataGrip)
LearningUnderstand the semantic layer mapping

Examples​

Simple Query SQL​

Request: "Show me the SQL for counting studies"

{
"measures": ["Studies.count"]
}

Response:

{
"sql": {
"sql": [
"SELECT count(*) AS \"studies__count\" FROM public.studies AS \"Studies\""
],
"timeDimensionAlias": null,
"timeDimensionField": null,
"order": [],
"cacheKeyQueries": [],
"preAggregations": []
}
}

Grouped Query SQL​

Request: "What SQL runs for enrollment counts by site?"

{
"measures": ["Enrollments.count"],
"dimensions": ["Sites.siteName"]
}

Response:

{
"sql": {
"sql": [
"SELECT \"Sites\".name AS \"sites__site_name\", count(*) AS \"enrollments__count\" FROM public.enrollments AS \"Enrollments\" LEFT JOIN public.sites AS \"Sites\" ON \"Enrollments\".site_id = \"Sites\".id GROUP BY 1"
]
}
}

Filtered Query SQL​

Request: "Generate SQL for active Phase 3 studies"

{
"measures": ["Studies.count"],
"dimensions": ["Studies.studyName"],
"filters": [
{
"member": "Studies.phase",
"operator": "equals",
"values": ["Phase 3"]
},
{
"member": "Studies.status",
"operator": "equals",
"values": ["Active"]
}
]
}

Response:

{
"sql": {
"sql": [
"SELECT \"Studies\".study_name AS \"studies__study_name\", count(*) AS \"studies__count\" FROM public.studies AS \"Studies\" WHERE (\"Studies\".phase = 'Phase 3') AND (\"Studies\".status = 'Active') GROUP BY 1"
]
}
}

Time Series SQL​

Request: "SQL for monthly enrollment trends"

{
"measures": ["Enrollments.count"],
"timeDimensions": [
{
"dimension": "Enrollments.enrollmentDate",
"granularity": "month",
"dateRange": ["2024-01-01", "2024-12-31"]
}
]
}

Response:

{
"sql": {
"sql": [
"SELECT date_trunc('month', \"Enrollments\".enrollment_date) AS \"enrollments__enrollment_date_month\", count(*) AS \"enrollments__count\" FROM public.enrollments AS \"Enrollments\" WHERE \"Enrollments\".enrollment_date >= '2024-01-01' AND \"Enrollments\".enrollment_date <= '2024-12-31' GROUP BY 1 ORDER BY 1"
],
"timeDimensionAlias": "enrollments__enrollment_date_month",
"timeDimensionField": "Enrollments.enrollmentDate"
}
}

SQL Components Explained​

ComponentDescription
sqlArray containing the generated SQL statement(s)
timeDimensionAliasAlias used for time grouping column
timeDimensionFieldOriginal time dimension field reference
orderApplied ordering clauses
cacheKeyQueriesQueries used for cache invalidation
preAggregationsPre-aggregation tables used (if any)

Error Handling​

Invalid Measure​

{
"error": "Cannot find measure 'Studies.invalidMeasure'"
}

Invalid Dimension​

{
"error": "Cannot find dimension 'Sites.unknownField'"
}