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

Power BI Chord visual: link tables with same column name

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

但多亏了 ,我现在能够根据 datatypecolumn name 对数据库图进行逆向工程。 (我知道,是基于假设的逆向工程师)。

我现在想使用 Chord visual 创建一个 Power BI 仪表板,并在具有相同列名的表之间创建一个 link。 (图片只是给你一个想法的例子)

但我不能使用 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 视觉对象中呈现它?

目标是在表之间找到 link。

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

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

  • 来自(外键table)
  • 至(主键table)
  • 关系计数

根据 table 的数量,您可能会发现 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 喜欢“%Id”

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

    AND c.name != 'rowguid'

  • 我们不想要主键 table 与自身的关系

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

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

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

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

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

根据您的意见,如果您想做同样的事情,但使用字段名称进行匹配(不假设名称[id])来表示您的 fk / pk,则以下方法可行。我已经包括了一个部分来根据主键检查约束来强制主 table,如果你想显示所有关系,你可以注释掉它,但要注意你将有数千个,如果它们是双向的,您无法识别主要 key/table!

    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;

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