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,我现在能够根据datatype
和column name
对数据库图进行逆向工程。 (我知道,是一个基于假设的逆向工程师)。
我现在想使用Chord visual 创建一个 Power BI 仪表板,并在具有相同列名的表之间创建一个链接。 (图片仅供参考)
但我不能使用From
和To
,因为我没有跟踪更改。
也许我使用了错误的视觉效果?
如何跟踪共同点?
为赏金编辑:
如果我对 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;
查询可以对具有相同的列进行分组:ColumnName
、DataType
、max_length
、precision
、scale
。
但是如何在 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 视觉对象:链接具有相同列名的表的主要内容,如果未能解决你的问题,请参考以下文章