query-design

Trennt DAX-Datenabruf von der TypeScript-Präsentation. Leitet an, wann DAX vs. TypeScript vs. Vega-Lite für Aggregation, Gesamtzeilen, FORMAT(),… verwendet werden soll.

npx skills add https://github.com/microsoft/fabric-apps-analytic-templates --skill query-design

Query Design — Separation of Data and Presentation

DAX computes and fetches data. TypeScript shapes it for display. VegaVisual and DataGrid render it.

Aggregate in DAX to the visual's grain — never fetch lower-grain rows to roll up client-side. When a visual layout changes, only the TypeScript or spec layer should change — not the DAX query.

Responsibility Matrix

ConcernOwner
Semantic measures (SUM, DISTINCTCOUNT, etc.)DAX
Fixed model/page filtersDAX
User-controlled visual filtersvisual-interactivity
Grouping grain (SUMMARIZECOLUMNS)DAX
Time intelligence (YTD, YoY)DAX
TopN / payload reductionDAX
Deterministic row ordering (ORDER BY)DAX (for debugging — not presentation sort)
Partitioning a flagged result tableTypeScript
Coordinating separate query resultsTypeScript (one hook call per result table)
Server-provided grand totals (preferred, supports all aggregation types)DAX + TypeScript row partitioning
DataGrid-computed grand totalsDataGrid (alternative only for additive sum values or a count of fetched leaf rows)
Filling dimension gapsTypeScript (stitch dimension list into sparse results)
Reshaping (pivot, unpivot)TypeScript
Column display namescolumnMetadata in factory file
Vega-Lite / DataGrid field identifierscolumnMetadata.name (bracket-free alias)
Number/date formattingcolumnMetadata.format / Vega-Lite spec
User-facing sort orderTypeScript / Vega-Lite sort / DataGrid sort
Decorative labels, iconsDataGrid cellRenderer or Vega-Lite condition
Axis titles, legends, color encodingVega-Lite spec

Rules

Must

  • Aggregate in DAX to the visual's grain — never fetch lower-grain rows just to roll them up to that grain in TypeScript
  • One EVALUATE per .dax file; use ROLLUPADDISSUBTOTAL when DataGrid body and grand-total grains share one result table
  • ORDER BY in DAX for stable, diffable results — not presentation sort
  • Same filters/measures across related split-grain queries to prevent drift

Prefer

  • SUMMARIZECOLUMNS for grouped aggregation — it also drops BLANK-measure rows, keeping payloads small
  • DAX's natural column names ('Table'[Column], [Measure]) as columnMetadata keys, mapped to a bracket-free name and a human-readable displayName
  • Raw typed values from DAX — format via columnMetadata.format or Vega-Lite, never FORMAT()
  • Model-defined format strings (from INFO.VIEW.MEASURES()) over invented ones
  • Multiple lightweight queries for independently shaped datasets; one flagged rollup query for a DataGrid body and grand total
  • User-facing sort in TypeScript / Vega-Lite / DataGrid — never re-query for sort

Avoid

  • SELECTCOLUMNS solely for renaming — use columnMetadata (name + displayName) instead
  • Reusing the raw DAX column name as columnMetadata.name — [ ] . make the visual read undefined
  • UNION to mix body and total grains — use ROLLUPADDISSUBTOTAL and partition its flagged rows
  • FORMAT() in DAX — converts to text, breaks sorting and charting
  • Converting BLANK to 0 / "" / "N/A" in DAX — causes result-set explosion
  • CONCATENATEX, UNICHAR, emoji prefixes — decorative text belongs in cellRenderer or Vega-Lite
  • Fetching all members of high-cardinality dimensions just to fill gaps

Decision Flowchart

Need to add something to the query result?
  |-- Calculation / aggregation / fixed scope filter?
  |     -> DAX (measures, CALCULATE, SUMMARIZECOLUMNS)
  |-- Interactive filter the user controls?
  |     -> Use the visual-interactivity skill
  |-- Adding a DataGrid grand total?
  |     -> DAX rollup query: split body and total rows with toRollupDataTables
  |        and always pass the returned grandTotalTable via grandTotals.data
  |     -> DataGrid-computed sum/count: pass grandTotals without data and set defaultAggregation
  |-- Merging datasets or adding other synthetic rows?
  |     -> Charts: pass multiple DataTables to VegaVisual, layer in spec
  |     -> Grids: append rows in TypeScript, style via cellRenderer
  |-- Renaming a column for display?
  |     -> columnMetadata in the factory file (displayName)
  |-- Formatting, labeling, or encoding?
  |     -> Vega-Lite spec or DataGrid cellRenderer
  |-- Decorating values (icons, status badges, null placeholders)?
  |     -> DataGrid cellRenderer or Vega-Lite condition encoding
  |-- Not sure?
        -> Does it change what the data *means* (filter, measure, grain)? -> DAX
           Does it change only how data is *rendered* (labels, icons, layout)? -> TypeScript / Vega-Lite spec / DataGrid cellRenderer
           Still unclear? -> Read the relevant reference above

Reference Materials

Read these when working on a specific topic:

  • Anti-patterns and corrections — Open when reviewing a query that uses UNION for totals, FORMAT(), SELECTCOLUMNS for renaming, CONCATENATEX/emoji decoration, BLANK-to-0 conversion, or GENERATE/CROSSJOIN for gap-filling.
  • Multi-grain patterns — Open when a single visualization needs data at multiple grains (e.g., bars + reference line, region detail + total row, monthly trend + YTD), to choose between one flagged rollup result and separate queries while keeping related factories, hooks, and DataTables aligned.
  • Format strings — Open when picking a columnMetadata.format value, when a measure has a dynamic format string, or when formatting needs to flow into a Vega-Lite axis.

Integration with Sibling Skills

  • schema-query — Query exact tables, columns, measures, and relationships before writing queries.
  • dax-authoring — DAX syntax, query patterns, and testing workflow. Apply this skill's principles when deciding what DAX should compute.
  • visuals — Vega-Lite specs and DataGrid configuration. Push formatting and labels into specs, not DAX.
  • visual-interactivity — Visual selections, cross-filtering, cross-highlighting, filter-aware grid totals, and runtime query parameters.

Mehr Skills von microsoft

oss-growth
microsoft
OSS-Wachstums-Hacker-Persona
agent-framework-azure-ai-py
microsoft
Erstellen Sie Azure AI Foundry-Agents mit dem Microsoft Agent Framework Python SDK (agent-framework-azure-ai). Verwenden Sie dies beim Erstellen persistenter Agents mit AzureAIAgentsProvider, bei der Nutzung gehosteter Tools (Code-Interpreter, Dateisuche, Websuche), bei der Integration von MCP-Servern, bei der Verwaltung von Konversationsthreads oder bei der Implementierung von Streaming-Antworten. Umfasst Funktionstools, strukturierte Ausgaben und Multi-Tool-Agents.
development
airunway-aks-setup
microsoft
Richte AI Runway auf AKS ein – vom leeren Cluster bis zum laufenden Modell. Umfasst Cluster-Überprüfung, Controller-Installation, GPU-Bewertung, Provider-Einrichtung und erste Bereitstellung. WANN: „AI Runway einrichten“, „AKS-Cluster onboarden“, „AI Runway installieren“, „airunway setup“, „Modell auf AKS bereitstellen“, „GPU-Inferenz auf AKS“, „KAITO-Setup auf AKS“, „LLM auf AKS ausführen“, „vLLM auf AKS“, „Modell-Serving auf AKS einrichten“, „AI Runway-Controller“.
devops
appinsights-instrumentation
microsoft
Leitfaden zur Instrumentierung von Webanwendungen mit Azure Application Insights. Bietet Telemetriemuster, SDK-Einrichtung und Konfigurationsreferenzen. WANN: wie man eine App instrumentiert, App Insights SDK, Telemetriemuster, was ist App Insights, Application Insights-Anleitung, Instrumentierungsbeispiele, APM-Best Practices.
devops
applicationinsights-web-ts
microsoft
Instrumentieren Sie Browser-/Web-Apps mit dem Application Insights JavaScript SDK (@microsoft/applicationinsights-web). Verwenden Sie es für Real User Monitoring (RUM) – Seitenaufrufe, Klicks, AJAX/Fetch-Abhängigkeiten, Ausnahmen, benutzerdefinierte Ereignisse und browser-seitige GenAI-Agent-Traces, die mit Backend-OpenTelemetry-Traces korreliert werden. Umfasst SDK-Loader-Skript und npm-Setup, Framework-Erweiterungen (React, React Native, Angular), Click Analytics, Telemetrie-Initialisierer und OTel-GenAI-Semantik-Konventionen für Agent-/Tool-/Modell-Spans, die vom Browser ausgegeben werden.
devops
azure-ai-anomalydetector-java
microsoft
Erstellen Sie Anomalieerkennungsanwendungen mit dem Azure AI Anomaly Detector SDK für Java. Verwenden Sie dies bei der Implementierung von univariater/multivariater Anomalieerkennung, Zeitreihenanalyse oder KI-gestützter Überwachung.
development
azure-ai-language-conversations-py
microsoft
Implementieren Sie Conversational Language Understanding (CLU) mit dem azure-ai-language-conversations Python SDK. Verwenden Sie dies, wenn Sie mit ConversationAnalysisClient arbeiten, um Gesprächsabsichten und Entitäten zu analysieren, NLP-Funktionen zu erstellen oder Sprachverständnis in Anwendungen zu integrieren.
development
azure-ai-ml-py
microsoft
Azure Machine Learning SDK v2 für Python. Verwenden für ML-Workspaces, Jobs, Modelle, Datensätze, Compute und Pipelines. Auslöser: „azure-ai-ml“, „MLClient“, „Workspace“, „Modell-Registry“, „Trainings-Jobs“, „Datensätze“.
development