# Dimensions and measures > Define the attributes you group and filter by, and the aggregations you measure, in dbt-compatible YAML *[View this page in the Flax docs](https://flax-analytics.com/docs/modeling/dimensions-and-measures)* Dimensions and measures are the queryable fields of a model. This page shows how to define them, with examples grounded in the Flax spec. They live under the `flax:` key of a dbt model, so the file stays a valid dbt schema file. ## Dimensions A **dimension** is an attribute you group or filter by — an order's status, a customer's country, or the date an order was placed. Each dimension needs a `name`, a `type`, and a `sql` expression. In `sql`, `${column}` refers to a column on this model. ```yaml flax: dimensions: - name: status type: string sql: ${status} - name: order_date type: time time_grains: [day, week, month, quarter, year] sql: ${created_at} ``` Dimension types are `string`, `number`, `boolean`, and `time`. A `time` dimension may declare `time_grains` — the buckets (day, week, month, quarter, year) a viewer can roll up to. Add a human-friendly `label`, a `description`, and set `hidden: true` to keep a field out of the explore picker while still using it in expressions. ## Measures A **measure** is an aggregation over rows. Each needs a `name` and a `type`; most types also take a `sql` expression naming the column to aggregate. ```yaml flax: measures: - name: order_count label: Number of orders type: count sql: "*" - name: total_revenue label: Total revenue type: sum sql: ${amount} - name: completed_revenue label: Completed revenue type: sum sql: ${amount} filters: - ${status} = 'complete' ``` Supported measure types: `count`, `count_distinct`, `sum`, `average`, `min`, `max`, `median`, `percentile`, and `number` (a raw expression, not aggregated). A `percentile` measure takes a `percentile:` value between 0 and 1 (e.g. `0.25` for Q1). ### Filtered measures The optional `filters` list holds SQL boolean expressions that are AND-ed into the aggregation. `completed_revenue` above sums `amount` only for rows where `status = 'complete'`, so you can define revenue variants without new columns. ## Formats and labels Use `label` to control how a field appears in the UI, and `description` to document intent — both surface in the explore experience and the AI assistant's context. Display formatting (currency, decimals, percentages) is applied at visualization time; see [Formatting and theming](/docs/visualizations/formatting-and-theming). > [!TIP] > Prefer defining a filtered measure over asking every analyst to add the same `WHERE` clause. Define once, reuse everywhere. ## Next steps - [Relationships and joins](/docs/modeling/relationships-and-joins) — query across models. - [Semantic YAML reference](/docs/modeling/semantic-yaml-reference) — every field and its constraints. - [SQL compilation](/docs/modeling/sql-compilation) — how these compile per dialect.