功率查询自定义函数可一次重命名表中的所有列

功率查询自定义函数可一次重命名表中的所有列

过去几天,我参与了Power BI开发。我从各种系统以不同格式(包括Excel,CSV和OData)导出了一些数据。 CSV文件是来自ERP系统的数据导出转储。使用ERP系统可能非常耗时,尤其是当您不这样做时’您无权访问数据模型,您会以CSV文件的原始格式获取数据。具有挑战性,因为在ERP系统中,表名和列名根本不是用户友好的,这是有道理的。 ERP系统正在各种环境中用于具有不同要求的许多不同客户。因此,如果可以使用基础数据模型,则会看到配置表保留了列名。一些专栏是自定义构建的,以满足特定需求。这些表可能有许多列,这些列不一定对分析有用。因此,对底层实体模型有一个很好的理解是非常关键的。无论如何,我不’不想走题。

问题

所以,这是我的情况。我收到了大约10个文件,其中包括15个表。有些桌子很小,所以我没有’麻烦了。但是其中有些真的很宽,例如具有150到208列之间。真好!

从列名来看,它们很难比它们更难读,并且我有多个这样的表。因此,我必须将这些列重命名为更具可读性的内容,稍后再进行介绍。

背景

我通过电子邮件发送给我的客户,要求他们的帮助。幸运的是,他们有一位非常出色的数据专家,他也了解他们的ERP系统以及底层实体模型。我通过电子邮件将当前的所有列名称发送给他,并询问他是否可以提供更多用户友好的名称。他用Excel中的映射表回复了我。这是显示 列名称映射 表:

列名称映射

我对映射表感到非常满意。现在,下一步是根据映射表重命名所有列。哎哟!我差不多 800 要重命名的列。从字面上看这是脖子上的疼痛,并且没有’听起来很正确,因为要刻录项目时间来重命名800列。

但是,等等,编写自动重命名过程又如何呢?就像编写自定义函数来一次重命名所有列一样?我记得我读了一篇很棒的博客文章,内容是 重命名Power Query中的多个列吉尔伯特·奎瓦维耶(Gilbert Quevauvilliers) 写于2018年。我绝对建议看一下他的博客文章。因此,我必须做与吉尔伯特相似的事情。创建一个获取原始列名称并带回新名称的自定义函数。然后,我在每个表中使用自定义函数来重命名列。简单!

继续阅读 “Power Query自定义函数可一次重命名表中的所有列”

快速技巧,Power BI Desktop,查询参数,第4部分,将Power Query参数值传递到SQL 服务器存储过程

我过去写过3篇关于查询参数的博文。

这是快速提示形式的第四篇。这是场景。我的一位客户要求从SQL 服务器的存储过程中获取数据。她需要将值从“查询参数”传递回SQL 服务器,并在Power BI中获得结果。

解决方案有点简单。我在中创建了一个简单的存储过程 AdventureWorksDW2019 如下:

CREATE PROCEDURE SP_Sales_by_Date 
	@date 在t
AS
BEGIN
	SET NOCOUNT ON;
	SELECT *
	FROM [dbo].[FactInternetSales]
	WHERE OrderDateKey >= @date
END
GO

在Power BI Desktop中,从SQL 服务器获取数据,然后:

  • 输入 服务器 名称
  • 输入 数据库 名称
  • 选择 数据连接模式
  • 展开 高级选项
  • 输入一个 SQL语句 调用存储过程,如下所示:
exec SP_Sales_by_Date @date = 20140101
  • 点击确定
使用Power BI Desktop中的SQL语句从SQL 服务器获取数据
  • 请点击 转换资料
在Power BI Desktop中转换数据

现在我们需要创建一个查询参数。在我的示例中,我创建了一个 日期键 小数 数据类型:

在Power BI Desktop中创建新的查询参数
继续阅读 “快速技巧,Power BI Desktop,查询参数,第4部分,将Power Query参数值传递到SQL 服务器存储过程”

快速提示:在单次幂查询函数中将十六进制,十进制和二进制转换为十进制

强大的查询功能,可将HEX,OCT和BIN值转换为DEC

前一段时间我写了一篇关于如何使用的博客文章 Power BI中的Unicode字符。在该博文中,我使用了递归Power Query函数将十六进制值转换为Dec值。几周前,我的一位访问者好心地分享了 他的Power Query函数的非递归版本 做得很好。大声喊着 罗科·卢波(Rocco Lupoi) 共享他的代码。因此,我决定与所有人共享它,以便更多的人可以利用他出色的Power Query功能。虽然我已经触及了他的代码,但这只是表面上的改变,因此本博文的所有功劳归Rocco所有。他的代码的好处不仅限于非递归。 下面的代码在基数小于16时(例如Binary和Oct)转换任何基数的数字,因此它是 仅限于 十六进制 价值观 只要。以下代码的另一个好处是它不区分大小写(请注意 digits 踩下面的代码)。

这里是 fnHex2Dec 电源查询功能:

(input as text, optional base as number) as number =>
let
        价值观 = [
                0=0,
                1=1,
                2=2,
                3=3,
                4=4,
                5=5,
                6=6,
                7=7,
                8=8,
                9=9,
                A=10,
                B=11,
                C=12,
                D=13,
                E=14,
                F=15
        ],
        digits = Text.ToList(Text.Upper(input)),
        dim = List.Count(digits)-1,
        exp = if base=null then 16 else base,
        Result = List.Sum(
                        List.Transform(
                                {0..dim}
                                , 每 Record.Field(values, digits{_}) * Number.Power(exp, dim - _)
                                )
                        )
in
        Result

As you see 在 the code above, the base parameter is optional, so if 不 provided base 16 would be the default.

这就是我们可以调用上面的函数的方式:

fnHex2Dec("AbCdEf", null)
调用fnHex2Dec函数将任意基数转换为十进制
继续阅读 “快速提示:在单次幂查询函数中将十六进制,十进制和二进制转换为十进制”

快速提示:根据Power Query中的其他值有条件地替换值

功率查询(M)使许多数据转换活动变得更加容易,而价值替换就是其中之一。您可以轻松地右键单击Excel或Power BI中的Power Query中的任何所需值,或者通常是Power Platform的其他组件,然后只需用任何所需的替代项替换该值即可。首先,根据某些条件替换值似乎并不那么容易。一世’我们已经看到许多Power Query(M)开发人员添加了新列来完成该任务。但是,添加新列并不总是一个好主意,尤其是当您可以在Power Query中仅一步之遥就可以做到这一点时。在本文中,我向您展示了一种快速简便的方法,可以帮助您处理许多不同的价值替换方案。

假设您有一个如下表,并且如果[A] = [B],则需要将列[B]的值替换为列[C]的值。

Power BI中的样本数据

一种方法是使用以下逻辑添加新的条件列:

if [B] = [A] then [C] else [B]

好吧,它工作得很好,但是等等,你’重新添加一个新列吧?不会’最好在不添加新列的情况下处理上述简单情况?如果您的回答是,请继续阅读。

继续阅读 “快速提示:根据Power Query中的其他值有条件地替换值”