数据库设计用于报告比较结果

Database Design For reporting comparison results

我们将设计一个 table 架构。在这里,我想比较来自不同来源的同类数据,比如 Source_ASource_B。我必须比较几个属性并确定以下情况

  1. 属性 1 不匹配
  2. 属性 2 不匹配
  3. source_A
  4. 中缺少的数据
  5. Source_B 中缺少的数据。

最后我在 PowerBI 中用图表报告了同样的情况。现在我有 2 tables A_DATAB_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