查找 Table 条与自上而下的层次结构不匹配的记录
Find Table Records That Don't Match Top Down Hierarchy Structure
我有一个非规范化的 table,我正在尝试评估它的层次结构问题。正确的格式是大型组织的自上而下的层次结构。从概念上讲,每个人都应该只有一个报告经理,但由于它是非规范化的,因此情况并非总是如此。我想查找特定员工拥有多个报告经理的所有记录。下面是一些示例数据:
LVL1_First_Name|LVL1_Last_Name|LVL1_Emp_ID|LVL2_First_Name|LVL2_Last_Name|LVL2_Emp_ID|LVL3_First_Name|LVL3_Last_Name|LVL3_Emp_ID
---------------+--------------+-----------+---------------+--------------+-----------+---------------+--------------+-----------
Jack |Gorshon |0001 |Henry |Johnson |0003 |Amy |Taylor |0005
Robert |Harris |0002 |Henry |Johnson |0003 |Nick |Greer |0006
Robert |Harris |0002 |Jim |Balial |0004 |Josh |Wolfe |0007
如您所见,Henry Johnson 向 Robert 和 Jack 报告时,层次结构存在问题。我希望创建一个 SQL 语句来提取此 table 的前两条记录,因为它们不遵循真正的自上而下的层次结构。
我试图通过...与一个小组一起解决这个问题,但它没有得到我需要的结果。
注意:我不负责这种数据格式。我的目标是在将其放入适当的规范化数据结构之前对其进行清理和清理。
嗯。 . .您可以对数据进行逆透视以对其进行归一化,然后进行聚合:
select v.emp_id, min(lev), max(lev)
from t cross apply
(values (LVL1_Emp_ID, LVL2_Emp_ID, 2), (LVL1_Emp_ID, LVL3_Emp_ID, 3)
) v(parent_emp_id, emp_id, lev)
from v.emp_id
group by v.emp_id
having min(parent_emp_id) <> max(parent_emp_id);
我有一个非规范化的 table,我正在尝试评估它的层次结构问题。正确的格式是大型组织的自上而下的层次结构。从概念上讲,每个人都应该只有一个报告经理,但由于它是非规范化的,因此情况并非总是如此。我想查找特定员工拥有多个报告经理的所有记录。下面是一些示例数据:
LVL1_First_Name|LVL1_Last_Name|LVL1_Emp_ID|LVL2_First_Name|LVL2_Last_Name|LVL2_Emp_ID|LVL3_First_Name|LVL3_Last_Name|LVL3_Emp_ID
---------------+--------------+-----------+---------------+--------------+-----------+---------------+--------------+-----------
Jack |Gorshon |0001 |Henry |Johnson |0003 |Amy |Taylor |0005
Robert |Harris |0002 |Henry |Johnson |0003 |Nick |Greer |0006
Robert |Harris |0002 |Jim |Balial |0004 |Josh |Wolfe |0007
如您所见,Henry Johnson 向 Robert 和 Jack 报告时,层次结构存在问题。我希望创建一个 SQL 语句来提取此 table 的前两条记录,因为它们不遵循真正的自上而下的层次结构。
我试图通过...与一个小组一起解决这个问题,但它没有得到我需要的结果。
注意:我不负责这种数据格式。我的目标是在将其放入适当的规范化数据结构之前对其进行清理和清理。
嗯。 . .您可以对数据进行逆透视以对其进行归一化,然后进行聚合:
select v.emp_id, min(lev), max(lev)
from t cross apply
(values (LVL1_Emp_ID, LVL2_Emp_ID, 2), (LVL1_Emp_ID, LVL3_Emp_ID, 3)
) v(parent_emp_id, emp_id, lev)
from v.emp_id
group by v.emp_id
having min(parent_emp_id) <> max(parent_emp_id);