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

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

过去几天,我参与了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 Query中的OData Feed Analyzer定制功能

Power BI和Excel的Power Query中的OData Feed Analyzer自定义功能

It’s been a while 那 I am working with 数据 data source 在 Power BI. One challenge 那 I almost always do not have a good understanding of the underlying data model. It can be really hard 和 time consuming if there is no one 在 the business 那 understands the underlying data model. I know, we can use $metadata to get the metadata schema from the 数据 feed, but let’不去那里。我不是OData专家,但是这里是像我这样的人的事,我使用的数据源不一定是专家,但我需要了解实体是什么,它们如何连接等…那如果我没有任何中小型企业(S对象 M东北黑钙土 Expert)谁可以帮助我?

因此,参与更多OData选项,让’s get 在to it.

The custom function below accepts an 数据 URL then it discovers all tables, their column count, their row count (more on this later), number 和 list of related tables, number 和 list of columns of type text, type numberDecimal.Type.

// fnODataFeedAnalyser
(ODataFeed as text) => 
  let
    Source = OData.Feed(ODataFeed),
    SourceToTable = Table.RenameColumns(
        Table.DemoteHeaders(Table.FromValue(Source)), 
        {{"柱1", "Name"}, {"柱2", "Data"}}
      ),
    FilterTables = Table.SelectRows(
        SourceToTable, 
        each Type.Is(Value.Type([Data]), Table.Type) = true
      ),
    SchemaAdded = Table.AddColumn(FilterTables, "Schema", each Table.Schema([Data])),
    TableColumnCountAdded = Table.AddColumn(
        SchemaAdded, 
        "Table 柱 Count", 
        each Table.ColumnCount([Data]), 
        Int64.Type
      ),
    TableCountRowsAdded = Table.AddColumn(
        TableColumnCountAdded, 
        "Table Row Count", 
        each Table.RowCount([Data]), 
        Int64.Type
      ),
    NumberOfRelatedTablesAdded = Table.AddColumn(
        TableCountRowsAdded, 
        "Number of Related Tables", 
        each List.Count(Table.ColumnsOfType([Data], {Table.Type}))
      ),
    ListOfRelatedTables = Table.AddColumn(
        NumberOfRelatedTablesAdded, 
        "List of Related Tables", 
        each 
          if [Number of Related Tables] = 0 then 
            null
          else 
            Table.ColumnsOfType([Data], {Table.Type}), 
        List.Type
      ),
    NumberOfTextColumnsAdded = Table.AddColumn(
        ListOfRelatedTables, 
        "Number of Text 柱s", 
        each List.Count(Table.SelectRows([Schema], each Text.Contains([Kind], "text"))[Name]), 
        Int64.Type
      ),
    ListOfTextColunmsAdded = Table.AddColumn(
        NumberOfTextColumnsAdded, 
        "List of Text 柱s", 
        each 
          if [Number of Text 柱s] = 0 then 
            null
          else 
            Table.SelectRows([Schema], each Text.Contains([Kind], "text"))[Name]
      ),
    NumberOfNumericColumnsAdded = Table.AddColumn(
        ListOfTextColunmsAdded, 
        "Number of Numeric 柱s", 
        each List.Count(Table.SelectRows([Schema], each Text.Contains([Kind], "number"))[Name]), 
        Int64.Type
      ),
    ListOfNumericColunmsAdded = Table.AddColumn(
        NumberOfNumericColumnsAdded, 
        "List of Numeric 柱s", 
        each 
          if [Number of Numeric 柱s] = 0 then 
            null
          else 
            Table.SelectRows([Schema], each Text.Contains([Kind], "number"))[Name]
      ),
    NumberOfDecimalColumnsAdded = Table.AddColumn(
        ListOfNumericColunmsAdded, 
        "Number of Decimal 柱s", 
        each List.Count(
            Table.SelectRows([Schema], each Text.Contains([TypeName], "Decimal.Type"))[Name]
          ), 
        Int64.Type
      ),
    ListOfDcimalColunmsAdded = Table.AddColumn(
        NumberOfDecimalColumnsAdded, 
        "List of Decimal 柱s", 
        each 
          if [Number of Decimal 柱s] = 0 then 
            null
          else 
            Table.SelectRows([Schema], each Text.Contains([TypeName], "Decimal.Type"))[Name]
      ),
    #"Removed Other 柱s" = Table.SelectColumns(
        ListOfDcimalColunmsAdded, 
        {
          "Name", 
          "Table 柱 Count", 
          "Table Row Count", 
          "Number of Related Tables", 
          "List of Related Tables", 
          "Number of Text 柱s", 
          "List of Text 柱s", 
          "Number of Numeric 柱s", 
          "List of Numeric 柱s", 
          "Number of Decimal 柱s", 
          "List of Decimal 柱s"
        }
      )
  in
    #"Removed Other 柱s"
继续阅读 “快速提示:Power Query中的OData Feed Analyzer定制功能”

在Power BI和Excel中的Power Query中查找所有表中的最小日期和最大日期

在Power BI和Excel中的Power Query中查找所有表中的最小日期和最大日期

当我们谈论Power BI中的数据分析时, 日期 表是不可避免的。有多种方法可以创建 日期 table either 在 达克斯 or 在 功率查询。在 达克斯 you my use either CALENDAR() function or CALENDARAUTO() 创建的功能 日期 table. In 功率查询 您可以结合使用 List.Dates()#date() and #duration() 职能。无论哪种方式,总有一个挑战,那就是如何找到一个合适的日期范围,该范围从过去的日期开始,到将来的日期结束,涵盖数据模型中的所有相关日期。一个简单的答案是, 我们可以问业务。中小企业知道有效日期范围是多少。.

尽管这是一个正确的论点,但并非总是如此。特别是 开始日期 这是过去的日期。在许多情况下,企业会说:

让我们看一下数据以找出答案.

这也是正确的一点,我们总是可以查看数据,找到其中的所有列 日期 or 日期Time 然后,数据类型按升序或降序对数据进行排序以获得结果。但是,如果有很多呢?然后,此过程可能非常耗时。

你们中许多人可能已经认为我们可以使用 CALENDARAUTO() in 达克斯 而且我们很乐意去。好吧,那不是很正确。在很多情况下 日期 or 日期Time 我们不能考虑的列 日期 尺寸。如出生日期或去世日期。在这篇文章的后面将对此进行更多讨论。

在这篇文章中,我分享了一段我为自己编写的代码。我当时正在确定 开始日期 and the 结束日期 日期维度的次数很多,所以我认为这可能对您也有帮助。

这个怎么运作?

我在这篇文章中分享的Power Query表达式首先使用以下方法获取所有现有查询:

  • #sections intrinsic variable
  • 筛选出当前查询名称,即 GetMinMaxAllDates 在我的示例中,为避免出现以下错误:

Expression.Error:评估期间遇到循环引用。

Expression.Error:评估期间遇到循环引用。
继续阅读 “在Power BI和Excel中的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 服务器存储过程”