Power BI Chord 视觉对象:链接具有相同列名的表

Posted

技术标签:

【中文标题】Power BI Chord 视觉对象:链接具有相同列名的表【英文标题】:Power BI Chord visual: link tables with same column name 【发布时间】:2021-12-16 22:59:06 【问题描述】:

有人将 DB2 数据库迁移到 SQL Server,在迁移过程中所有 PK 和 FK 都丢失了。没有办法让他们回来。

但是感谢this query,我现在能够根据datatypecolumn name 对数据库图进行逆向工程。 (我知道,是一个基于假设的逆向工程师)。

我现在想使用Chord visual 创建一个 Power BI 仪表板,并在具有相同列名的表之间创建一个链接。 (图片仅供参考)

但我不能使用FromTo,因为我没有跟踪更改。

也许我使用了错误的视觉效果?

如何跟踪共同点?

为赏金编辑:

如果我对 Adventure Works 运行查询:

WITH ColumnCount AS(
    SELECT s.name AS SchemaName,
           t.name AS TableName,
           c.name AS ColumnName,
           ct.[name] AS DataType,
           c.max_length,
           c.precision,
           c.scale,
           COUNT(c.column_id) OVER (PARTITION BY c.[name], ct.[name], c.max_length, c.precision, c.scale) AS Duplicates
    FROM sys.schemas s
         JOIN sys.tables t ON s.schema_id = t.schema_id
         JOIN sys.columns c ON t.object_id = c.object_id
         JOIN sys.types ct ON c.user_type_id = ct.user_type_id)
SELECT *
FROM ColumnCount CC
WHERE CC.Duplicates > 1
ORDER BY CC.ColumnName,
         CC.SchemaName,
         CC.TableName;

查询可以对具有相同的列进行分组:ColumnNameDataTypemax_lengthprecisionscale

但是如何在 Power BI Chord 视觉对象中呈现它?

目标是找到表之间的链接。

Chord 似乎是存档它的最佳视觉效果,但如果您有更好的视觉效果建议我愿意接受您的提示。

【问题讨论】:

【参考方案1】:

要关联 Power BI Chord 视觉对象,您至少需要两个数据点和一个度量;

来自(外键表) 到(主键表) 关系计数

根据表格的数量,您可能会发现 Chord 图表有点被数据淹没,但是如果您通过表单 Adventure Works 带来这三个值,您可以生成

您开始使用的数据集包含比您需要的更多信息和行,但自然不包含关系。通过使用以下内容简化数据集,您可以创建 Chord 数据点

WITH ColumnCount AS(
    SELECT  t.name AS TableName,
            c.name AS ColumnName,
            COUNT(c.column_id) OVER (PARTITION BY c.[name],  c.max_length, c.precision, c.scale) AS Duplicates
    FROM  sys.tables t 
         JOIN  sys.columns c ON t.object_id = c.object_id
    WHERE   c.name  like '%Id'
    AND     c.name != 'rowguid'
    
)

SELECT      TableName ForeignTableName,
            LEFT(ColumnName, LEN(ColumnName)-2) PrimaryTableName,
            1 Relationship
FROM        ColumnCount CC
WHERE       CC.Duplicates > 1
AND         LEFT(ColumnName, LEN(ColumnName)-2) != TableName 
ORDER BY    PrimaryTableName, 
            CC.ColumnName,
            CC.TableName

为了简单起见,我在上面做了一些假设。

所有外键都以 ID 结尾(以阻止不正确的键匹配,例如 ActualCost)

WHERE c.name like '%Id'

Rowguid 不是关系列,因此被排除在外

AND c.name != 'rowguid'

我们不希望与自身建立主键表关系

LEFT(ColumnName, LEN(ColumnName)-2) != 表名

方案不重要(因此被删除)

查询将为您提供如下结果集;

然后要创建图表,只需将 From、To 和 Values 计数与您的 PrimaryTableName、ForeignTableName 和关系(计数)值添加如下

为您提供所需的 Power BI Chord 关系图

根据您的 cmets,如果您想这样做,但使用匹配的字段名称(不假设 name[id])来表示您的 fk / pk,那么以下将起作用。我已经包含了一个部分来强制主表,基于主键检查约束,如果你想显示所有关系,你可以注释掉,但要注意你会有数千个,如果你不这样做,它们将是双向的有办法识别主键/表!

    WITH ColumnCount AS(
    SELECT s.name AS SchemaName,
           t.name AS TableName,
           c.name AS ColumnName,
           ct.[name] AS DataType,
           c.max_length,
           c.precision,
           c.scale,
           COUNT(c.column_id) OVER (PARTITION BY c.[name], ct.[name], c.max_length, c.precision, c.scale) AS Duplicates
    FROM sys.schemas s
         JOIN sys.tables t ON s.schema_id = t.schema_id
         JOIN sys.columns c ON t.object_id = c.object_id
         JOIN sys.types ct ON c.user_type_id = ct.user_type_id
         
         )

SELECT cc.TableName + '.' + cc.ColumnName ForeignTableName, cd.TableName + '.' + cd.ColumnName PrimaryTableName, 1 Relationship --,cc.ColumnName, cc.DataType,  cc.Duplicates
FROM ColumnCount CC 
    /*pk only joins - take ths out if you want all joins between fields, not just pk to fk */
    INNER JOIN  INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col on col.COLUMN_NAME = cc.ColumnName
    AND         col.TABLE_NAME = cc.TableName
    INNER JOIN  INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab on     Col.Constraint_Name = Tab.Constraint_Name
    AND Col.Table_Name = Tab.Table_Name
    AND Constraint_Type = 'PRIMARY KEY'
    /*end of pk only joins */

LEFT JOIN ColumnCount Cd on cc.ColumnName = cd.ColumnName
and cc.DataType= cd.DataType
and cc.TableName != cd.TableName
WHERE CC.Duplicates > 1
ORDER BY CC.ColumnName,
         CC.SchemaName,
         CC.TableName;

插入相同的结构,这提供了一个和弦图

【讨论】:

感谢您抽出宝贵时间@Darly,但问题是我手中的数据库中没有 PK 和 FK。一点关系都没有。我要创建的关系基于列名和数据类型。您的查询正在搜索 PK 和 FK,因此超出了范围。 您没有 PK / FK,但在引用的 Adventure Works 示例中,您有被命名为引用字段的列(即最后带有 Id 的列)。我所做的是采用 SalesOrderId 并假设这是与 SalesOrder 表的关系。数据库中不存在实际关系的期望,只是命名列。冒险作品示例是否代表您的实际数据,其字段以 [Id] 结尾? 顺便说一句,同样的逻辑可以纯粹用于字段名称来创建您的 Chord 图表,正如您在操作中建议的那样,但是您最终会在碰巧具有相同名称的列上连接(例如 ActualCost、AccountName、RowGuid 等)。使用您的数据,您需要制定一个模式来确定 pk 表,从 fk 像我所做的那样(通过删除 Id),然后将其添加为列以提供您的关系 ...mmm... 我想完全基于列名和数据类型。但我明白你的意思。如何修改您的查询并使用列名和数据类型来创建 1 个关系?我以AdverntureWork 为例,但我所在的数据库当然不是AdventureWork。感谢您的帮助 您可以创建 2 路过滤器,但只能通过创建表。根据关系列创建新的视觉对象(不要转换过滤器视觉对象,因为它不起作用)并将视觉对象设置为表格。和弦图和表格现在应该可以双向过滤。不幸的是,这对于过滤器视觉效果不太好,因为它只有一种方式。

以上是关于Power BI Chord 视觉对象:链接具有相同列名的表的主要内容,如果未能解决你的问题,请参考以下文章

Power BI:需要根据切片器选择向表格视觉对象添加列

Power BI学习

Power BI DAX 度量:考虑视觉对象的筛选上下文,计算列中值的出现次数

Power BI - R 脚本视觉 - Apriori

Power BI中常规切片器的使用方法及视觉效果

如何在power bi中分析/分组文本