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

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

前一段时间我写了一篇关于如何使用的博客文章 Power 双中的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}
                                , each Record.Field(values, digits{_}) * Number.Power(exp, dim - _)
                                )
                        )
in
        Result

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

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

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

快速提示: 时间 Dimension with 时间 Bands at Seconds Granularity in Power 双 和 SSAS表格

时间 Dimension with 时间 Bands at Seconds Granularity in Power 双 和 SSAS表格

过去我也写过其他有关此主题的文章,您可以找到它们 这里 这里。在第一篇文章中,我解释了如何创建“Time”时间带的维度 分钟 粒度。然后,我的一位客户要求“Time”几秒钟内的尺寸,这鼓励了我写第二篇博客文章。在第二篇博文中,虽然我没有’t做时间带,所以我在这里写第三篇文章,这是第二篇文章支持5分钟,15分钟,30分钟,45分钟和60分钟的时间带的变体。“Time”尺寸降至秒。在这篇快速文章中,我直接跳到重点,向您展示如何生成“Time”维度以三种不同的方式,即在SQL Server中使用T-SQL,使用Power Query(M)和DAX。然后是这里:

时间 Dimension at Second Grain with 功率查询 (M) Supporting 时间 Bands:

在查询编辑器中复制/粘贴以下代码’s Advanced Editor to generate 时间 dimension in 功率查询:

let
Source = Table.FromList({1..86400}, Splitter.SplitByNothing()),
    #"Renamed Columns" = Table.RenameColumns(Source,{{"Column1", "ID"}}),
    #"时间 Column Added" = Table.AddColumn(#"Renamed Columns", "时间", each 时间.From(#datetime(1970,1,1,0,0,0) + #duration(0,0,0,[ID]))),
    #"Hour Added" = Table.AddColumn(#"时间 Column Added", "Hour", each 时间.Hour([Time])),
    #"Minute Added" = Table.AddColumn(#"Hour Added", "Minute", each 时间.Minute([Time])),
    #"5 Min Band Added" = Table.AddColumn(#"Minute Added", "5 Min Band", each 时间.From(#datetime(1970,1,1,0,0,0) + #duration(0, 0, Number.RoundDown(Time.Minute([Time])/5) * 5, 0))  +  #duration(0, 0, 5, 0)),
    #"15 Min Band Added" = Table.AddColumn(#"5 Min Band Added", "15 Min Band", each 时间.From(#datetime(1970,1,1,0,0,0) + #duration(0, 0, Number.RoundDown(Time.Minute([Time])/15) * 15, 0))  +  #duration(0, 0, 15, 0)),
    #"30 Min Band Added" = Table.AddColumn(#"15 Min Band Added", "30 Min Band", each 时间.From(#datetime(1970,1,1,0,0,0) + #duration(0, 0, Number.RoundDown(Time.Minute([Time])/30) * 30, 0))  +  #duration(0, 0, 30, 0)),
    #"45 Min Band Added" = Table.AddColumn(#"30 Min Band Added", "45 Min Band", each 时间.From(#datetime(1970,1,1,0,0,0) + #duration(0, 0, Number.RoundDown(Time.Minute([Time])/45) * 45, 0))  +  #duration(0, 0, 45, 0)),
    #"60 Min Band Added" = Table.AddColumn(#"45 Min Band Added", "60 Min Band", each 时间.From(#datetime(1970,1,1,0,0,0) + #duration(0, 0, Number.RoundDown(Time.Minute([Time])/60) * 60, 0))  +  #duration(0, 0, 60, 0)),
    #"Removed Other Columns" = Table.SelectColumns(#"60 Min Band Added",{"时间", "Hour", "Minute", "5 Min Band", "15 Min Band", "30 Min Band", "45 Min Band", "60 Min Band"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Removed Other Columns",{{"时间", type time}, {"Hour", Int64.Type}, {"Minute", Int64.Type}, {"5 Min Band", type time}, {"15 Min Band", type time}, {"30 Min Band", type time}, {"45 Min Band", type time}, {"60 Min Band", type time}})
in
#"Changed Type"
继续阅读 “Quick Tips: 时间 Dimension with 时间 Bands at Seconds Granularity in Power 双 和 SSAS表格”

Power 双治理,良好实践,第2部分:使用OneDrive,团队和SharePoint Online进行版本控制

Power 双治理,商业用OneDrive,Microsoft Teams和SharePoint Online的版本控制

软件开发生命周期中最重要的方面之一是控制解决方案的不同版本,尤其是在一个项目中,有多个开发人员参与实施的项目中。就像通常在Visual Studio中创建项目并将更改提交回GitHub或Azure DevOps之类的源代码控制系统一样,’建议保留Power 双报告不同版本的历史记录。我们对源代码控制解决方案的期望是,在开发项目时始终跟踪源代码中发生的所有更改。因此,您可以根据需要轻松地回滚到以前的状态。 

拥有源代码控制流程的另一个好处是,当多个开发人员在一个项目上工作时。它们中的每一个都对源代码进行更改,然后将所有更改提交到源代码控制服务器中,而不会相互覆盖’ work. 

但是使用Power 双会有些不同。 Power 双报告文件是以二进制格式存储的PBIX文件(嗯,PBIX基本上是一个zip文件吗?),在撰写本文时,尚无官方方法来实施Power 双 源代码控制 在任何源代码控制解决方案中,如GitHub或Azure DevOps(YET)。 

微软上周(6/05/2020)宣布了一项名为“部署管道”的功能完全可以满足我们的需求,但目前是预览功能,仅适用于具有Power 双 Premium的组织。因此,对于我们大多数人来说,这是不可行的。

话虽如此,仍然存在一种方法来保留PBIX文件不同版本的形状变化的历史记录。这就是所谓的 版本控制.

开发报告时,有几种方法可以启用对PBIX文件的版本控制。无论版本控制平台是什么,您都需要考虑拥有多个环境以及谁可以访问它们以执行操作。

环境可访问描述
发展历程开发者数据建模人员和报表编写者出于开发目的而访问此环境。 
用户验收测试 (UAT)开发人员,中小企业,技术主管,Power 双管理员开发完成后,开发人员将解决方案部署到UAT环境。然后,该解决方案将由SME(主题专家)进行测试,以确保满足业务要求。
预生产 (可选,但推荐)Power 双管理员技术主管解决方案通过所有UAT测试方案后,技术主管或Power 双管理员将其部署到Pro-prod中进行最终检查,以确保所有数据源正确指向生产数据源,并且所有报告和仪表板均按预期工作。 
生产技术主管,Power 双管理员,最终用户产品前检查完成后,技术主管或Power 双管理员将解决方案部署到生产环境中,然后供最终用户使用。

版本控制选项

如果您的组织没有高级能力,则“Deployment Pipelines”该功能对您不可用。因此,您需要提出一个解决方案。在本节中,我列出了一些可用的版本控制选项

  • 商业用OneDrive
  • 微软团队 / 的SharePoint在线
继续阅读 “Power 双治理,良好实践,第2部分:使用OneDrive,团队和SharePoint Online进行版本控制”

在Power 双中使用SWITCH()和ISINSCOPE()DAX函数突出显示每个层次结构平均销售额以下

在Power 双中使用SWITCH()和ISINSCOPE()DAX函数突出显示每个层次结构平均销售额以下

不久前,我在一个项目上工作,客户对柱形图有条件格式要求。
他们希望根据基于您所处的层次结构的平均值,有条件地对图表中的列设置格式。
在这种情况下,我的日历层次结构如下:

  • 日历层次结构:
    • 学期
    • 25美分硬币

我用“Adventure Works DW2017,互联网销售”Excel作为Power 双 Desktop中的源。如果我想形象化“Total Sales” over the above “Calendar Hierarchy”我得到这样的东西:

Line Chart in Power 双, 总销售额 by 年

现在我激活“Average Line” from “Analytics”折线图标签。

Adding 平均线 to Line Chart in Power 双

当我在折线图中向下钻取时,“平均”线显示了我所在的特定层次结构级别的平均值。’m in code free.

Power 双,折线图中的钻井

容易吧?

现在,要求是在一个“柱形图”(是的!用柱形图可视化时间序列,’则是客户的期望值),然后用橙色突出显示值低于平均值的列,其余的保留为默认主题颜色。

因此,我需要创建度量以有条件地格式化柱形图。我还需要在以下方面增加一些智能:

  • 检测我所在的层次结构级别
  • 计算该特定层次结构级别的平均销售额
  • 更改低于平均值的列的颜色

让’s get it done!

使用ISINSCOPE()DAX函数检测层次结构级别

微软介绍 ISINSCOPE() 达克斯功能 2018年11月版本 Power 双桌面。宣布后不久“Kasper de Jonge” wrote a concise 博客文章 关于它。

因此,我尝试使其尽可能简单。这是工作原理,ISINSCOPE()函数返回“True”当指定的列在层次结构级别中时。如前所述,我们有一个“Calendar Hierarchy”包括以下5个级别:

  • 学期
  • 25美分硬币

因此,要确定我们是否处于上述每个层次结构级别中,我们只需要创建如下的DAX度量即可:

ISINSCOPE年		=	ISINSCOPE('Date'[Year])
ISINSCOPE 学期	=	ISINSCOPE('Date'[Semester])
ISINSCOPE 25美分硬币	=	ISINSCOPE('Date'[Quarter])
ISINSCOPE 月		=	ISINSCOPE('Date'[Month])
ISINSCOPE 天		=	ISINSCOPE('Date'[Day])

现在让’做一个简单的实验。

  • 在画布上放置一个矩阵
  • 放在“Calendar Hierarchy” to “Rows”
  • 采取上述措施“Values”
Detecting 年, 学期, 25美分硬币, 月 和 天 hierarchy levels with ISINSCOPE in Power 双桌面

如你所见“ISINSCOPE 年” shows “True” for the “Year” level. 让’扩展到下一个级别,并查看其他度量如何工作:

继续阅读 “在Power 双中使用SWITCH()和ISINSCOPE()DAX函数突出显示每个层次结构平均销售额以下”