Страницы: 1
RSS
Найти типов, у которых сбережения более 25, Dax
 
Здравствуйте
Какой мерой можно найти этих типов?
 
Off
Цитата
Михаил Л написал:
Какой мерой можно найти этих типов?
раскулачиванием  :D . Сбережения у них понимаешь !
По вопросам из тем форума, личку не читаю.
 
Михаил Л, здравствуйте! Вариант SQL запросом (результат на листе result)
Код
Sub select_types()
Dim mySQL As String, myConnect As String, myRecord As Object
Dim oRange As Range, QT As QueryTable
Set myRecord = CreateObject("ADODB.Recordset")
Set oRange = Worksheets("Лист1").Cells(12, 3).CurrentRegion
Debug.Print oRange.Address
myConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source =" & ThisWorkbook.FullName & ";" & _
            "Extended Properties=""Excel 12.0;HDR=YES;"""
mySQL = "SELECT [Типы], SUM([Сбережения]) as Сбережения FROM " & oRange.Address(0, 0) & " GROUP BY [Типы] HAVING SUM([Сбережения]) > 25 ORDER BY [Типы] ASC "
myRecord.Open mySQL, myConnect

With Worksheets("result")
    .Cells.Clear
    Set QT = .QueryTables.Add(myRecord, .Cells(1, 1))
    QT.Refresh
End With
myRecord.Close
Set QT = Nothing
Set myRecord = Nothing
Call delete_conn_of_qt(Worksheets("result"))
End Sub
Private Sub delete_conn_of_qt(wsh As Worksheet)
Dim conn
For Each conn In wsh.QueryTables
    conn.Delete
Next conn
End Sub
 
Код
=calculate(sum('Таблица1'[Сбережения]);filter('Таблица1';SUM('Таблица1'[Сбережения])>25))
либо
Код
sumx(filter('Таблица1';SUM('Таблица1'[Сбережения])>25);'Таблица1'[Сбережения])
Изменено: Дмитрий(The_Prist) Щербаков - 20.08.2022 11:23:41
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
artemkau88, спасибо, однако надо мерой Dax.
Дмитрий(The_Prist) Щербаков, большое спасибо! Все работает!
Цитата
БМВ написал:
раскулачиванием
Зачем раскулачивать) Их же можно мерой Dax выявить, а затем, как в фильме "Контрибуция", предложить пожертвовать)
Шучу конешно
 
Позволю себе добавить комментарий :)
Фильтровать всю таблицу вот так filter('Таблица1';SUM('Таблица1'[Сбережения])>25) не лучшая идея :) Нам достаточно отфильтровать таблицу VALUES ( 'Таблица1'[Типы] ) и ее поместить в выражение фильтра CALCULATE. Уникальных типов гораздо меньше, чем строк в таблице фактов.
Это будет гораздо более эффективно.
Мои варианты:
Код
mera:=
VAR filterTipov =
    FILTER (
        VALUES ( 'Таблица1'[Типы] );
        CALCULATE ( SUM ( 'Таблица1'[Сбережения] ) ) > 25
    )
VAR result =
    CALCULATE ( SUM ( 'Таблица1'[Сбережения] ); filterTipov )
RETURN
    result

Код
mera2:=
VAR groupSaving =
    ADDCOLUMNS (
        VALUES ( 'Таблица1'[Типы] );
        "@saving"; CALCULATE ( SUM ( 'Таблица1'[Сбережения] ) )
    )
VAR filterSaving =
    FILTER ( groupSaving; [@saving] > 25 )
VAR result =
    SUMX ( filterSaving; [@saving] )
RETURN
    result

Ставлю на то, что второй шустрее :)
Изменено: surkenny - 20.08.2022 18:40:22
 
surkenny, спасибо
Реальных данных не более 20тыс строк. Любая формула Dax отработает по-быстрому. Завтра проверю как раз
 
Цитата
surkenny написал:
Ставлю на то, что второй шустрее
Можно еще сократить:
Код
mera3 :=
VAR groupSaving =
    ADDCOLUMNS (
        VALUES ( 'Таблица1'[Типы] );
        "@saving"; CALCULATE ( SUM ( 'Таблица1'[Сбережения] ) )
    )
VAR result =
    SUMX ( groupSaving; DIVIDE ( [@saving]; [@saving] > 25 ) )
RETURN
    result
 
StepanWolkoff,  ого какой прием, надо запомнить.
 
StepanWolkoff, круто :) А есть какие-нибудь данные, насколько это может ускорить расчёт? По идее, не должно отличаться от моего варианта, но код компактнее.
А вот использование всей таблицы в выражении фильтра - очень сильно бьет по производительности.
Плюс не нужно забывать, что в некоторых случаях фильтруя целой таблицей нужно обязательно помнить о расширенных таблицах! А то результат может удивить :).Если Вы (в данном случае подразумевается любой, кто читает это сообщение :) ) не поняли, что такое расширенная таблица и почему нужно об этом помнить, читаем Феррари/Руссо :)
Изменено: surkenny - 23.08.2022 14:20:10
 
surkenny, mera2 и mera3 почти идентичны как физический, так и логический план запроса, но в mera3 все таки на одну итерацию меньше и на значительных объемах разница может стать заметной. Но опять, не забываем, что здесь все в одной таблице, а при больших объемах и создании справочников и при соответствующем изменении мер, не факт, что даже mera окажется хуже, так ее физический план запроса при использовании справочника "типов" почти в два раза короче. Но это все надо смотреть на боевых данных, ну или близких к ним по структуре и размеру, там вобще может оказаться все не так=)
Изменено: StepanWolkoff - 24.08.2022 10:01:30
 
Если не нужна общая сумма в итогах, то мой вариант такой:
Код
=
VAR a =
    SUM ( 'Таблица1'[Сбережения] )
VAR b =
    FILTER ( ADDCOLUMNS ( SUMMARIZE ( 'Таблица1'; [Типы] ); "@sber"; a ); a > 25 )
VAR c =
    SUMX ( b; [@sber] )
RETURN
    c

 
PowerBI_WannaBe, у вас переменная "а" один раз рассчитывается, и когда вы ее добавляете в столбец "@sber" она не будет пересчитываться.
чтобы пересчитывалась с использованием преобразования контекста, нужно не переменную туда ставить , а меру, или вычисление обернутое в CALCULATE.
 
Lari,  спасибо за уточнение, поправил.
Да, там вроде был какой-то подводный камень с расчетом переменных внутри меры. Что она считается только в первый раз (или как-то так наверно)
Теперь работает корректно
Код
=VAR b =
    FILTER (
        ADDCOLUMNS (
            SUMMARIZE ( 'Таблица1'; [Типы] );
            "@sber";
                CALCULATE (
                    SUMX ( 'Таблица1'; 'Таблица1'[Сбережения] )
                )
        );
        [@sber] > 25
    )
VAR c =
    CALCULATE ( SUMX ( b; [@sber] ) )
RETURN
    c

Изменено: PowerBI_WannaBe - 24.08.2022 12:14:22
Страницы: 1
Наверх