Привет, Хабр! В работе Business Intelligence аналитика могут встречаться задачи проверки DAX запроса на произвольной схеме, к которой может не быть доступа. Перевод DAX запроса из исходной схемы в схему, к которой есть доступ и есть возможность выполнения DAX запроса, может занимать некоторое время и требовать определенных усилий. В век AI, безусловно, хочется делать перевод в схему автоматически, при помощи AI. Кроме того, ресурс dax.do является достаточно удобной песочницей для Contoso схемы данных, поэтому такое впечатление, что одним из быстрых решений для анализа и запуска DAX без схемы данных является перевод произвольного DAX в dax.do (например, автоматически при помощи Telegram бота), что позволяет уже дальше смотреть полученный DAX в песочнице dax.do на схеме Contoso без каких-то ограничений. Это позволяет проверить работоспособность DAX на незнакомой схеме за секунды. Интересующимся новыми возможностями DAX песочниц — добро пожаловать под кат :)
Известной песочницей DAX является dax.do, в котором зашита схема Contoso.

Видно, что такая схема способна поддерживать DAX запросы достаточно сложной структуры. В связи с этим, если у нас есть DAX запрос, но нет самой схемы данных, актуальным является перевод DAX запроса в схему данных Contoso для dax.do, тогда можно легко использовать все возможности песочницы dax.do и исследовать DAX, аналогичный исходному, даже без самой исходной схемы.
Ручной перевод DAX в схему Contoso может быть утомительным и рутинным, и выглядит отличной задачей для AI. Соответственно, AI модели решают задачи перевода из одной схемы данных в другую без особенных проблем. Например, Telegram бот «dax.do Fiddle» способен легко решить подобные задачи. Рассмотрим следующий DAX и для перевода в Contoso из dax.do:
EVALUATE
SUMMARIZECOLUMNS (
Клиент[Количество детей],
FILTER ( Продажи, Продажи[Количество] > AVERAGE ( Продажи[Количество] ) ),
FILTER ( Клиент, Клиент[Количество детей] > 1 ),
"Calculated Количество",
1 + 2 * CALCULATE (
SUMX ( Продажи, Продажи[Количество] * RELATED ( Клиент[Количество детей] ) ),
REMOVEFILTERS ( Продажи[Количество] ),
FILTER ( Клиент, Клиент[Количество детей] < 4 )
)
)
Отправим этот DAX в «dax.do Fiddle»

Готово, получили результат за секунды, теперь можно идти в dax.do и работать с полученным DAX, являющимся аналогом исходного DAX.

Видно, что переведенный в Contoso схему DAX запрос валидный и успешно выполняется.
Также можно рассмотреть и несколько более сложный DAX запрос.
DEFINE
VAR filtered =
FILTER (
'факты',
'факты'[количество] > 0
&& 'факты'[сумма] > 300
&& 'факты'[сумма] < 500
)
VAR yearly =
SUMMARIZECOLUMNS (
'даты'[год],
'продукты'[производитель],
'клиенты'[пол],
"Продажи",
SUMX ( filtered, 'факты'[сумма] * IF ( 'факты'[цена] > 0, 0.2, 0.7 ) )
)
VAR byYear =
FILTER ( yearly, YEAR ( TODAY () ) > MAX ( 'даты'[год] ) )
VAR top2 =
TOPN ( 2, byYear, [Продажи], DESC )
EVALUATE
top2
ORDER BY 'продукты'[производитель] ASC
«dax.do Fiddle» также переводит в Contoso для dax.do и этот запрос:

В итоге получаем запрос, который успешно выполняется в dax.do:

Стоит отметить, что в боте использовалась всего лишь модель gpt-4o, результаты можно считать неплохими, возможно, подойдет и более простая модель. Изредка бот может давать невалидный DAX из-за несовпадения типов колонок (строка и число), но зачастую бот решает такие вопросы самостоятельно (как для YEAR(MAX('Date'[Date]))
), иначе приходится исправлять вручную, но это в любом случае быстрее, чем обрабатывать запрос полностью вручную.
Надеюсь, работа над такими инструментами и сами инструменты вида «dax.do Fiddle» в форме Telegram бота могут быть полезными для аналитиков и разработчиков, имеющих дело с DAX. Успехов в дашбордах и DAX запросах :)