Одним из решений этой проблемы является добавление двух параметров списка значений и использование их значений в коде Power Query M для изменения запроса к базе данных. Предположим, что у вас есть таблица Data
со столбцами Department
, Product
и Revenue
. Для простоты я добавлю еще один столбец с именем Dummy Column
, в котором все строки имеют одинаковое значение (например, null
). Я объясню почему позже в этом посте. Таким образом, таблица выглядит следующим образом:
Затем укажите в своем отчете запрос при добавлении этой таблицы в вашу модель (предположим, мы ее импортируем, но в целом вы можете сделать это и в DirectQuery):
Теперь, если вы посмотрите код M, вы увидите вышеупомянутый запрос:
Source = Sql.Database(".", "StackOverflow", [Query=" select ....
Теперь определите пару параметров, которые конечный пользователь может использовать для выбора способа агрегирования данных. Давайте назовем их Level 1
и Level 2
:
Значение параметра можно использовать в М по имени параметра, а &
используется для объединения строк. Поэтому, если есть параметр Name
со значением Samuel
, выражение "Hello, " & Name & "!"
будет оцениваться как Hello, Samuel!
. Идея состоит в том, чтобы проверить значение наших параметров и соответственно изменить запрос к базе данных.
В выделенной части мы заменим имя выбранного поля или добавим ''
(пустая строка) в случай <All>
(я заключил значения параметров в скобки, чтобы было легче отличить значения guish от имен полей базы данных). Таким образом, выражение должно выглядеть следующим образом:
"select " & (if #"Level 1" = "<Department>" then "Department" else ..." (and so on)
Поскольку в имени нашего параметра есть пробел, нам нужно заключить его в #"
и "
, поэтому на Level1
можно ссылаться просто как Level1
в коде, но Level 1
становится #"Level 1"
.
Группировать по частям немного сложнее. Мы должны добавить запятую между именами полей, добавить или не указывать имя поля или даже вообще не указывать group by
(в случае, если оба параметра установлены на <All>
). Чтобы упростить это, я добавил один фиктивный столбец, в котором все строки имеют одинаковое значение (например, null
) и всегда группируем по этому столбцу. Таким образом, построение предложения group by гораздо проще - в случае, если значение параметра не равно <All>
, мы должны добавить , fieldname
. Таким образом, код может выглядеть следующим образом:
"group by DummyColumn" & (if #"Level 1" = "<Department>" then ", Department" else ..." (and so on)
Итак, окончательный код М выглядит так:
let
Source = Sql.Database(".", "StackOverflow", [Query="select#(lf) " & (if #"Level 1" = "<Department>" then "Department" else if #"Level 1" = "<Product>" then "Product" else "''") & " as [Org Level 1]#(lf) , " & (if #"Level 2" = "<Department>" then "Department" else if #"Level 2" = "<Product>" then "Product" else "''") & " as [Org Level 2]#(lf) , SUM(Revenue) as Revenue#(lf)from Data#(lf)group by DummyColumn" & (if #"Level 1" = "<Department>" then ", Department" else if #"Level 1" = "<Product>" then ", Product" else "") & (if #"Level 2" = "<Department>" then ", Department" else if #"Level 2" = "<Product>" then ", Product" else "")])
in
Source
Сейчас конечный пользователь может изменить значения параметров, нажав Edit Queries
-> Edit Parameters
:
и выберите способ группировки данных:
По умолчанию Power BI Desktop впервые предупредит вас при выполнении определенного запроса:
Если вы хотите отключить это, go до File
-> Options and settings
-> Options
-> (GLOBAL) Security
и убедитесь, что Require user approval for new native database queries
не выбран:
Когда конечный пользователь меняет значения параметров, данные тоже изменяются, например:
Или:
И так далее ...
Этот прием хорошо работает в Power BI Рабочий стол, когда у каждого пользователя есть собственная копия файла .pbix. Однако, если вы опубликуете sh, сначала изменить значения параметров не очень удобно (вы должны go настроить параметры датасата) и, что более важно, изменение значений параметров затронет всех пользователей, которые просматривают этот отчет. Вы также можете использовать его для изменения операторов Table.Group
, сгенерированных Power Query Editor, в случае, если вы хотите объединить данные в Power BI, но изменить запрос к базе данных проще и более гибко.
Если вы хотите включите этот сценарий для одновременного многопользовательского сценария ios для опубликованных отчетов, вы можете использовать срезы и параметры "что, если" . К сожалению, параметры «что-если» могут быть нумерацией c (вы не можете определить список значений там), поэтому вы можете использовать меры для «декодирования» значения int параметра и написать некоторый код DAX для выполнения различных агрегаций соответственно , Это больше работы, но если это необходимо, это тоже можно сделать.