Power BI Chord 视觉对象:link 个具有相同列名的表
Power BI Chord visual: link tables with same column name
有人将 DB2 数据库迁移到 SQL 服务器,在迁移过程中所有 PK 和 FK 都丢失了。没有办法让他们回来。
但多亏了 ,我现在能够根据 datatype
和 column name
对数据库图进行逆向工程。 (我知道,是基于假设的逆向工程师)。
我现在想使用 Chord visual 创建一个 Power BI 仪表板,并在具有相同列名的表之间创建一个 link。 (图片只是给你一个想法的例子)
但我不能使用 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 视觉对象中呈现它?
目标是在表之间找到 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;
插入相同的结构,这提供了一个和弦图
有人将 DB2 数据库迁移到 SQL 服务器,在迁移过程中所有 PK 和 FK 都丢失了。没有办法让他们回来。
但多亏了 datatype
和 column name
对数据库图进行逆向工程。 (我知道,是基于假设的逆向工程师)。
我现在想使用 Chord visual 创建一个 Power BI 仪表板,并在具有相同列名的表之间创建一个 link。 (图片只是给你一个想法的例子)
但我不能使用 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 视觉对象中呈现它?
目标是在表之间找到 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;
插入相同的结构,这提供了一个和弦图