计算DAX中底部三分之一的平均值

问题描述 投票:0回答:1

我试图获得工资按工资升序排序的数据中较低三分之一的平均值。我试图使用FILTER返回TOPN,不包括BLANK()工资值。然后我需要在AVERAGE计算中选择我关心的列。所以我写了类似下面的内容,其中[withSalaryJobCount]是一个计算度量,它只是具有非BLANK annualSalary列的行数:

entryWages:= AVERAGE(
        SELECTCOLUMNS(
            CALCULATE(
                TOPN(
                    [withSalaryJobCount]- [withSalaryJobCount]/3,
                    'table',
                    'table'[salaryAnnual],
                    ASC
                    ),
                FILTER(table, [salaryAnnual] <> BLANK())
            ),[entryWages]
            "bottomThird",
            [salaryAnnual]
        )
    )

这失败了,错误是:

The AVERAGE function only accepts a column reference as an argument

原始问题:我有一套SQL计算,它给出了百分比工资以及我们所说的入门和经验水平工资。工资列表输入到一个表中,该表按IDENTITY列的值排序。下面列出了一个简单的查询,用于插入和计算百分位数,条目和经验工资:

CREATE TABLE #t1 (
    id int identity,
    salaryannual decimal(18,2)
    )
INSERT INTO #t1
SELECT salaryannual
FROM table a
ORDER BY salaryannual

SELECT  
    (SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=minID AND ID<=minID+(ct/3)) entryLevelSalary,  
    (SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=maxID-(ct/3) AND ID<=maxID) experiencedSalary,
    (select AVG(CAST(salaryannual AS BIGINT)) from #t1 where ID = minID + (ct/2+1)/2 or ID = minID + (ct/2+1)/2 + (ct/2+1)%2) q1, 
    (select AVG(CAST(salaryannual AS BIGINT)) from #t1 where ID = minID + (ct+1)/2 or ID = minID + (ct+1)/2  + (ct+1)%2 ) median, 
    (select AVG(CAST(salaryannual AS BIGINT)) from #t1 where ID = minID + ct+1 - ((ct/2+1)/2 + (ct/2+1)%2) or ID = minID + ct+1 -((ct/2+1)/2) ) q3,
    (SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=minID AND ID<=maxID) avgSal
FROM
(
    SELECT COUNT(*) ct, MIN(ID) minID, MAX(ID) maxID
    FROM #t1
) uniqueIDs

转换百分位数计算的形式如下:

pct25Wages:= Calculate(PERCENTILE.INC('table'[salaryAnnual], .25), FILTER([withSalaryCount] > 6))

使用FILTER是因为我们至少要求至少有7个条目带有工资。

我的问题是如何将条目/体验转换为DAX /度量查询?

(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=minID AND ID<=minID+(ct/3)) entryLevelSalary,  
(SELECT AVG(CAST(salaryannual AS BIGINT)) FROM #t1 WHERE ID>=maxID-(ct/3) AND ID<=maxID) experiencedSalary,

我已尝试使用如下所示的STDEV和AVERAGE工资计算,但它没有给出预期的结果并且看着它我可以看到它不会像我预期的那样工作:

entryWages:= [avgWages] + 3 * [StdDevWage]
dax ssas-tabular
1个回答
0
投票

所以,经过多次撞墙后,我就是这样做的。首先,我需要在[salaryAnnual]列中对我的行进行排名。但是,由于许多条目可以具有相同的工资,我还通过使用分配给该行的uniqueID来稍微调整计算:

RANKX(
    'TABLE',
    'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
    ,
    ASC
    )

然后我使用这个值给我带薪水的最后三分之一(measure [withSalaryJobCount]):

TOPN(
    1 + ( [withSalaryJobCount]/3),
    'TABLE',
    RANKX(
        'TABLE',
        'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
        ,
        ASC
        ),
    ASC
    )

最后,我只需要获取非salary的[salaryAnnual]列,只从计算表中取出[salaryAnnual]列,得到平均值:

AVERAGEX(
        SELECTCOLUMNS(
            CALCULATETABLE(
                TOPN(
                    1 + ( [withSalaryJobCount]/3),
                    'TABLE',
                    RANKX(
                        'TABLE',
                        'TABLE'[salaryAnnual] + ('TABLE'[ID] / 1000000000),
                        ,
                        ASC
                        ),
                    ASC
                    ),
                FILTER(TABLE, [salaryAnnual] <> BLANK())
            ),
            "bottomThird",
            'TABLE'[salaryAnnual]
        ), [bottomThird]
    )
© www.soinside.com 2019 - 2024. All rights reserved.