数据库设计用于报告比较结果
Database Design For reporting comparison results
我们将设计一个 table 架构。在这里,我想比较来自不同来源的同类数据,比如 Source_A
和 Source_B
。我必须比较几个属性并确定以下情况
- 属性 1 不匹配
- 属性 2 不匹配
- source_A
中缺少的数据
- Source_B 中缺少的数据。
最后我在 PowerBI 中用图表报告了同样的情况。现在我有 2 tables A_DATA
和 B_DATA
来存储传入的数据,并且都具有以下结构(这只是一个示例,我有更多的列)
+---------------+
| Columns |
+---------------+
| Material_ID |
+---------------+
| Material_Name |
+---------------+
| Material_Type |
+---------------+
| Quantity |
+---------------+
现在我很困惑是否应该为 4 个案例(不匹配,Source_A 缺失,Source_B 缺失)创建单独的 table 还是在单个 table 中我应该再增加一列 Status
并将所有内容保留在那里。对于 PowerBI 中的报告(例如 1K 行中,5K 是不匹配的)。请建议哪个更适合报告病例。我真的很困惑。
我会说你的两个选项(附加列或新的 table)都不是最佳选择。我认为这最好用视图来处理。类似于:
CREATE VIEW MisMatches
AS
SELECT Material_ID = ISNULL(a.Material_ID, b.Material_ID),
Status = CASE WHEN a.Material_ID IS NULL THEN 'Mising A'
WHEN b.Material_ID IS NULL THEN 'Mising B'
WHEN a.Material_Name <> b.Material_Name THEN 'Mismatch Name'
WHEN a.Material_Type <> b.Material_Type THEN 'Mismatch Type'
WHEN a.Quantity <> b.Quantity THEN 'Mismatch Quantity'
END,
MaterialName_A = a.Material_Name,
MaterialName_B = b.Material_Name,
Material_Type_A = a.Material_Type,
Material_Type_B = b.Material_Type,
Quantity_A = a.Quantity,
Quantity_B = b.Quantity
FROM A_Data AS a
FULL JOIN B_Data AS b
ON b.Material_ID = a.Material_ID
WHERE CHECKSUM(a.Material_Name, a.Material_Type, a.Quantity) <> CHECKSUM(b.Material_Name, b.Material_Type, b.Quantity);
你状态栏上的这个短路可能不是你想要的,也就是说如果你的名字,数量和类型都不匹配,那么状态只会告诉你这个名字是一个不匹配。如果您想要所有不匹配,则需要稍微扩展 case 表达式。此外,如果您的任何列都可以为 null,则您需要在 Status
case 表达式中处理它,例如
WHEN a.Quantity <> b.Quantity OR a.Quantity IS NULL OR b.Quantity IS NULL THEN ...
我还必须假设您如何识别匹配项,但希望这能给出一般要点
编辑
有比 CHECKSUM
更好的方法:
CREATE VIEW MisMatches
AS
SELECT Material_ID = ISNULL(a.Material_ID, b.Material_ID),
Status = CASE WHEN a.Material_ID IS NULL THEN 'Mising A'
WHEN b.Material_ID IS NULL THEN 'Mising B'
WHEN a.Material_Name <> b.Material_Name THEN 'Mismatch Name'
WHEN a.Material_Type <> b.Material_Type THEN 'Mismatch Type'
WHEN a.Quantity <> b.Quantity THEN 'Mismatch Quantity'
END,
MaterialName_A = a.Material_Name,
MaterialName_B = b.Material_Name,
Material_Type_A = a.Material_Type,
Material_Type_B = b.Material_Type,
Quantity_A = a.Quantity,
Quantity_B = b.Quantity
FROM A_Data AS a
FULL JOIN B_Data AS b
ON b.Material_ID = a.Material_ID
WHERE NOT EXISTS
( SELECT a.Material_Name, a.Material_Type, a.Quantity
INTERSECT
SELECT b.Material_Name, b.Material_Type, b.Quantity
);
我阅读了以下文章发现了这一点:Undocumented Query Plans: Equality Comparisons
我们将设计一个 table 架构。在这里,我想比较来自不同来源的同类数据,比如 Source_A
和 Source_B
。我必须比较几个属性并确定以下情况
- 属性 1 不匹配
- 属性 2 不匹配
- source_A 中缺少的数据
- Source_B 中缺少的数据。
最后我在 PowerBI 中用图表报告了同样的情况。现在我有 2 tables A_DATA
和 B_DATA
来存储传入的数据,并且都具有以下结构(这只是一个示例,我有更多的列)
+---------------+
| Columns |
+---------------+
| Material_ID |
+---------------+
| Material_Name |
+---------------+
| Material_Type |
+---------------+
| Quantity |
+---------------+
现在我很困惑是否应该为 4 个案例(不匹配,Source_A 缺失,Source_B 缺失)创建单独的 table 还是在单个 table 中我应该再增加一列 Status
并将所有内容保留在那里。对于 PowerBI 中的报告(例如 1K 行中,5K 是不匹配的)。请建议哪个更适合报告病例。我真的很困惑。
我会说你的两个选项(附加列或新的 table)都不是最佳选择。我认为这最好用视图来处理。类似于:
CREATE VIEW MisMatches
AS
SELECT Material_ID = ISNULL(a.Material_ID, b.Material_ID),
Status = CASE WHEN a.Material_ID IS NULL THEN 'Mising A'
WHEN b.Material_ID IS NULL THEN 'Mising B'
WHEN a.Material_Name <> b.Material_Name THEN 'Mismatch Name'
WHEN a.Material_Type <> b.Material_Type THEN 'Mismatch Type'
WHEN a.Quantity <> b.Quantity THEN 'Mismatch Quantity'
END,
MaterialName_A = a.Material_Name,
MaterialName_B = b.Material_Name,
Material_Type_A = a.Material_Type,
Material_Type_B = b.Material_Type,
Quantity_A = a.Quantity,
Quantity_B = b.Quantity
FROM A_Data AS a
FULL JOIN B_Data AS b
ON b.Material_ID = a.Material_ID
WHERE CHECKSUM(a.Material_Name, a.Material_Type, a.Quantity) <> CHECKSUM(b.Material_Name, b.Material_Type, b.Quantity);
你状态栏上的这个短路可能不是你想要的,也就是说如果你的名字,数量和类型都不匹配,那么状态只会告诉你这个名字是一个不匹配。如果您想要所有不匹配,则需要稍微扩展 case 表达式。此外,如果您的任何列都可以为 null,则您需要在 Status
case 表达式中处理它,例如
WHEN a.Quantity <> b.Quantity OR a.Quantity IS NULL OR b.Quantity IS NULL THEN ...
我还必须假设您如何识别匹配项,但希望这能给出一般要点
编辑
有比 CHECKSUM
更好的方法:
CREATE VIEW MisMatches
AS
SELECT Material_ID = ISNULL(a.Material_ID, b.Material_ID),
Status = CASE WHEN a.Material_ID IS NULL THEN 'Mising A'
WHEN b.Material_ID IS NULL THEN 'Mising B'
WHEN a.Material_Name <> b.Material_Name THEN 'Mismatch Name'
WHEN a.Material_Type <> b.Material_Type THEN 'Mismatch Type'
WHEN a.Quantity <> b.Quantity THEN 'Mismatch Quantity'
END,
MaterialName_A = a.Material_Name,
MaterialName_B = b.Material_Name,
Material_Type_A = a.Material_Type,
Material_Type_B = b.Material_Type,
Quantity_A = a.Quantity,
Quantity_B = b.Quantity
FROM A_Data AS a
FULL JOIN B_Data AS b
ON b.Material_ID = a.Material_ID
WHERE NOT EXISTS
( SELECT a.Material_Name, a.Material_Type, a.Quantity
INTERSECT
SELECT b.Material_Name, b.Material_Type, b.Quantity
);
我阅读了以下文章发现了这一点:Undocumented Query Plans: Equality Comparisons