# Results grid > Query output lands in a grid under the editor. It sorts and filters in place, pages through large results, and switches to Json mode or the job's metadata. Source: https://docs.querylab.io/results/results-grid/ Row numbers on the left, a filter icon on every header, paging and tools in the footer. ## Sorting, filtering and arranging columns | Action | How | | ---------------------- | ------------------------------------------------------------------------------------------ | | Sort | Click the header; again for descending; a third time clears | | Multi-sort | Shift-click more headers | | Filter | The filter icon in the header: text, number and date filters, depending on the column type | | Resize | Drag the header edge; double-click to fit the content | | Reorder | Drag the header | | Pin, format, copy name | Right-click the header | **right-click a numeric header** **Format** appears on numeric columns only: None, Standard, Compact, Currency, Percentage, Scientific, Bytes, with a live preview of a value from the column. **Pin column** offers Pin Left, Pin Right, Unpin. Widths, order, pins, sorts, filters and formats are saved per tab and come back with it. There is no per-column hide. To drop the columns that are entirely NULL, use the eye button in the footer; its tooltip counts them (_Hide 3 null column(s)_), and it stays highlighted while they're hidden. ## Finding rows `⌘` `F` with the grid focused opens a search box in place of the pager. It matches any column and filters as you type; `Esc` closes it and clears the filter. ## Paging The footer shows `1-50 of 4,213 rows`. Pick the page size (20, 50, 100 or 1000) from the button next to the pager, and jump to a random page with the shuffle button on the far left, handy for eyeballing a large result. Narrow panels swap the numbered pager for a _Go to page_ box. ## Nested and repeated fields STRUCT and ARRAY values are pretty-printed as JSON inside the cell, and rows with identical values in adjacent cells are merged vertically. To show STRUCT fields as grouped columns instead (`corporate` → `parent_company`, `country_of_origin`), turn on Settings → Data & Results → **Group nested columns**. With Group nested columns on, each STRUCT field is its own column under the parent's name. Values longer than the cell are cut; the tooltip says so and points you to export for the full value. ## Copying out of the grid The grid has no cell selection; `⌘ C` on a cell does nothing. Instead: | What | How | | ---------------------------------------- | ----------------------------------------------------- | | The current page, tab-separated | **Copy to clipboard** in the footer | | The result table's path | ⌘-click the same button, or the **Drill Down** button | | A column name | Right-click the header → **Copy column name** | | Up to 1,000 rows as TSV or a Slack table | **Export** → Clipboard | | The visible rows as an image | `⌘ K` → **Copy results as image** | More formats and destinations are on the [Export](https://docs.querylab.io/results/export/) page. ## Drill down Every query result lives in a temporary BigQuery table. **Drill Down** (the split icon) opens `SELECT * FROM` that table in a new tab beside the current one, so you can filter and aggregate the result without paying for the original scan again. If the tab is already split you're asked which side to replace. ⌘-click copies the table path instead of opening it. ## Querying results locally **Open results in a local tab** loads the rows of a finished query into the engine that runs in your browser. The rows become a table in `local.results`, named after the tab, and a new tab opens on it with `SELECT *` already run. The status bar says **Runs on the local engine**: queries in that tab cost nothing and use no BigQuery quota, so you can filter, join and aggregate the result as often as you like. The storage statistics grids have the same button, so a storage report can be queried the same way. - One table holds up to 1,000,000 rows and 100 MB. A bigger result is refused before any row is read. - A column type the local engine can't hold yet is refused, with the reason. - Local tables last until the app is closed. Open the results again to recreate one. ## View modes The last footer button switches the view. Its tooltip names the current one. | Mode | Shows | | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Table | The grid above | | Json | The rows as a JSON array, syntax-highlighted; the copy button copies the JSON | | Info | The job: status, job id, user, location, timing and duration, billing model and reservation, bytes processed and billed, slot time, rows returned, cache hit | | Graph | Only for GQL results: nodes and edges. See [Graph queries](https://docs.querylab.io/writing-sql/graph-queries/) | | Chart | Only when the query carries a chart spec. See [Charts](https://docs.querylab.io/writing-sql/charts/) | **Mode: Json** ```json [ { "make": "CHAUSSON", "fuel_type": "Diesel", "total_tests": 103, "pass_rate": 89.32, "rank_in_fuel": 1 }, { "make": "SCANIA", "fuel_type": "Diesel", "total_tests": 447, "pass_rate": 87.7, "rank_in_fuel": 2 } ] ``` The **Query History** button next to the search opens the tab's history panel: every version of the SQL you ran here, with its results. See [Query history](https://docs.querylab.io/writing-sql/query-history/).