Sql server 2008 使用SQL server hierarchyid如何在祖先级别聚合叶节点值

Sql server 2008 使用SQL server hierarchyid如何在祖先级别聚合叶节点值,sql-server-2008,tsql,common-table-expression,hierarchyid,Sql Server 2008,Tsql,Common Table Expression,Hierarchyid,基于以下输出 我希望在祖先级别(即城市/州/国家)合计金额。例如: 在上面的例子中,我们有国家澳大利亚和两个州维多利亚州和新南威尔士州。维多利亚州有两个城市墨尔本和本迪戈,新南威尔士州没有城市。查询的结果应显示完全相同的记录数,但在祖先级别上的合计金额。比如说,墨尔本应该显示800,维多利亚应该显示1300,澳大利亚2500,如下所示: 使用hierarchyid的get祖先函数使用递归CTE可以做到这一点吗 创建表测试 EmployeeNode层次结构, 雇员名称varchar50, 地点:v

基于以下输出

我希望在祖先级别(即城市/州/国家)合计金额。例如: 在上面的例子中,我们有国家澳大利亚和两个州维多利亚州和新南威尔士州。维多利亚州有两个城市墨尔本和本迪戈,新南威尔士州没有城市。查询的结果应显示完全相同的记录数,但在祖先级别上的合计金额。比如说,墨尔本应该显示800,维多利亚应该显示1300,澳大利亚2500,如下所示:

使用hierarchyid的get祖先函数使用递归CTE可以做到这一点吗

创建表测试 EmployeeNode层次结构, 雇员名称varchar50, 地点:varchar50, 金额小数

改变表测试 将[Level]添加为EmployeeNode.GetLevel

插入测试员工节点、位置、员工名称、金额 值将“/0/”强制转换为hierarchyid、“Australia”、NULL、NULL

插入测试员工节点、位置、员工名称、金额 值将“/0/1/”强制转换为hierarchyid、“VIC”、NULL、NULL

插入测试员工节点、位置、员工名称、金额 值将“/0/1/1/”强制转换为hierarchyid,'Melbourne',NULL,NULL

插入测试员工节点、位置、员工名称、金额 值将“/0/1/1/1/”强制转换为hierarchyid,NULL,'Mary',300.00

插入测试员工节点、位置、员工名称、金额 值将“/0/1/1/2/”强制转换为hierarchyid,NULL,'Timothy',500.00

插入测试员工节点、位置、员工名称、金额 值将“/0/1/2/”强制转换为hierarchyid,'Bendigo',NULL,NULL

插入测试员工节点、位置、员工名称、金额 值将“/0/1/2/1/”强制转换为hierarchyid,NULL,'Paul',500.00

插入测试员工节点、位置、员工名称、金额 值将“/0/2/”强制转换为hierarchyid、“NSW”、NULL、NULL

插入测试员工节点、位置、员工名称、金额 值将“/0/2/1/”转换为等级ID,“新南威尔士州”,“彼得”,1200.00


从测试t中选择t.EmployeeNode.ToString,t.*这是精彩的HABO。你确实让它看起来很简单。谢谢。@user1309226-FWIW,我一直在摆弄如何使用CTE。看起来没有更好的解决方案了。最后,我们对完成工作的最有效方式感兴趣。你的回答非常适合我。
declare @Test as Table ( EmployeeNode HierarchyId, EmployeeName VarChar(50), Location VarChar(50), Amount Decimal );

insert into @Test ( EmployeeNode, Location, EmployeeName, Amount ) values
  ( Cast( '/0/' as HierarchyId ), 'Australia', NULL, NULL ),
  ( Cast( '/0/1/' as HierarchyId ), 'VIC', NULL, NULL ),
  ( Cast( '/0/1/1/' as HierarchyId ), 'Melbourne', NULL, NULL ),
  ( Cast( '/0/1/1/1/' as HierarchyId ), NULL, 'Mary', 300.00 ),
  ( Cast( '/0/1/1/2/' as HierarchyId ), NULL, 'Timothy', 500.00 ),
  ( Cast( '/0/1/2/' as HierarchyId ), 'Bendigo', NULL, NULL ),
  ( Cast( '/0/1/2/1/' as HierarchyId ), NULL, 'Paul', 500.00 ),
  ( Cast( '/0/2/' as HierarchyId ), 'NSW', NULL, NULL ),
  ( Cast( '/0/2/1/' as HierarchyId ), 'NSW', 'Peter', 1200.00 );

select EmployeeNode.ToString(), *, EmployeeNode.GetLevel() as [Level],
  ( select Sum( Amount )
      from @Test where EmployeeNode.IsDescendantOf( P.EmployeeNode ) = 1 ) as [Total]
  from @Test as P;