如何在PowerBI中用DAX复现MySQL多表关联分组计数查询
问题描述
我已经将一个MySQL数据库导入PowerBI,数据模型如下图所示:
我希望使用DAX复现如下MySQL查询:
SELECT concat(substring(ano, 1, 3), 0) AS decada, nombre_pais, nombre_ciudad, count(nombre_ciudad) AS numero FROM paises NATURAL JOIN ciudades NATURAL JOIN autores NATURAL JOIN publican NATURAL JOIN discos NATURAL JOIN canciones NATURAL JOIN listas_spotify GROUP BY decada, nombre_ciudad
该查询的逻辑为:通过paises、ciudades、autores、publican、discos、canciones、listas_spotify多表自然连接,按年代(由含日期参数的listas_spotify表的ano字段取前3位拼接0得到decada字段)、城市分组,统计每个城市(来自ciudades表)对应所在城市的乐队(来自autores表)创作的歌曲(来自canciones表)的数量,输出decada、nombre_pais、nombre_ciudad、numero四个字段,按numero排序后的结果示例如下:
decada, nombre_pais, nombre_ciudad, numero 1980, Inglaterra, Londres, 23 1990, Inglaterra, Londres, 15 1980, Inglaterra, Mánchester, 11 2000, EEUU, Austin, 11 2000, EEUU, Nueva York, 10 1980, EEUU, Boston, 9 1980, EEUU, Nueva York, 8 1990, Inglaterra, Mánchester, 7 1990, Inglaterra, Oxford, 7 ...
若直接将该查询结果表导入PowerBI,可轻松生成仅筛选五大城市的统计图表,如下图所示:
我目前不清楚如何基于PowerBI现有数据模型通过DAX实现该逻辑,不需要完整的解决方案,仅想了解如何关联表格,实现基于另一张表的参数统计某张表的项数,从而可以用DAX语法复现上述SQL查询。
解答
PowerBI的数据模型默认会基于已经建立的表间关系自动做筛选传递,不需要像SQL一样手动写JOIN语句,核心逻辑对应如下:
- 首先处理年代字段:在
listas_spotify表中新建计算列decada,公式为CONCATENATE(LEFT(listas_spotify[ano], 3), "0"),和SQL中concat(substring(ano,1,3),0)的逻辑完全一致。 - 表关联逻辑不用手动实现:只要你导入数据时,各表之间的外键关系已经正确建立(即你数据模型里的连线),DAX会自动沿
paises -> ciudades -> autores -> publican -> discos -> canciones -> listas_spotify的关系路径传递筛选条件,等价于SQL里的自然连接效果。 - 统计歌曲数量直接写度量值即可:新建度量值
numero = COUNT(canciones[<表内非空字段名>]),选择canciones表的主键字段计数即可。当你把decada、paises[nombre_pais]、ciudades[nombre_ciudad]三个字段放到可视化对象的维度栏时,DAX会自动按这三个维度分组统计对应符合条件的歌曲数量,和SQL的GROUP BY逻辑效果完全相同。
如果需要直接生成和SQL输出完全一致的计算表,也可以用SUMMARIZECOLUMNS函数实现,本质还是基于上述的自动关联+分组统计逻辑。
内容的提问来源于stack exchange,提问作者Javier Blanco
相关产品推荐
相关产品推荐

