SQL Server - 来自不同表的 CTE 递归 SUM 值

2024-03-14

我有一个表,其中的数据分层存储在名为Cs组织如下表所示。

Table Name : CsOrganization
OrgId   OrgParentId    OrgName
1       NULL           X COMPANY
2       1              Administrator
3       2              Adm 1
4       2              Adm 2
5       3              Adm 1_1

然后有一个表名为组织这与Cs组织表如下表所示。

Table Name : EmHisOrganization
EmpId   OrgId    
1       2          
2       2        
3       3       
4       4        
5       5        

每个员工都会有基于其所在组织的加班数据,并存储在加班 table.

Table Name : EmOvertime
EmpId   TotalOtReal    
1       1.00          
2       2.00        
3       3.00       
4       2.00        
5       1.00 

问题是我需要根据每个组织获取 TotalHours 总和。 TotalHours 的总和还必须对其所有子项的 TotalHours 数据求和。到目前为止,我设法找出他们的父母和孩子,但我不知道如何从不同的表中获取 TotalHours 数据并对其进行求和。据我所知,我需要连接这些表才能获取 TotalHours,但不幸的是 CTE Recursive 不允许在语法中使用 OUTER JOIN。这是我想要的基于上面示例的输出:

Desired Output
OrgId      OrgName       TotalHours    
1          X COMPANY     9.00
2          Administrator 9.00
3          Adm 1         4.00 
4          Adm 2         2.00
5          Adm 1_1       1.00   

请注意,Adm 1 的 TotalHours 来自 ID 为 3 的员工(在 TotalHours 列中的值为 3.00)和 ID 为 5 的员工(在 TotalHours 列中的值为 1.00)的总和,这导致所需表中的值为 4.00。当 ID 为 1 和 2 的 OrgId 在 TotalHours 中获得值 9.00 时,情况也是如此。

任何帮助将不胜感激。

编辑于 09/05/2016, 12.02,添加了表和我的查询尝试的关系。

这是关系的外观:表关系 https://i.stack.imgur.com/m59ds.png.

我的查询尝试(每个组织的结果为 0.00,但如果不推荐使用 where 子句,则锚查询显示正确的值):

With OrgTree (OrgId, OrgName, TotalHours) AS
(
SELECT      orgId, orgN, SUM(eReal) AS TotalHours
FROM        (SELECT OrgId AS orgId, OrgName AS orgN, CASE WHEN x.TotalOtReal IS NULL THEN 0 ELSE x.TotalOtReal END AS eReal
FROM        (SELECT f.OrgId, f.OrgName, o.TotalOtReal
FROM        dbo.CsOrganization AS f LEFT OUTER JOIN
(SELECT     OrgId, SUM(TotalOtReal) AS TotalOtReal
FROM        (SELECT a.EmpId, a.OrgId, b.TotalOtReal
FROM        dbo.EmHisOrganization AS a LEFT OUTER JOIN
(SELECT     EmpId, SUM(TotalOtReal) AS TotalOtReal
FROM        dbo.EmOvertime AS a
GROUP BY EmpId) AS b ON a.EmpId = b.EmpId) AS a_1
GROUP BY OrgId) AS o ON f.OrgId = o.OrgId
) AS x WHERE OrgId = 1) AS xx
GROUP BY orgId, orgN

UNION ALL
SELECT a.OrgId, a.OrgName, TotalHours FROM dbo.CsOrganization a
INNER JOIN OrgTree o ON a.OrgParentId = o.OrgId
)
SELECT a.OrgId, a.OrgName, SUM(a.TotalHours) AS TotalHours FROM OrgTree a
GROUP BY a.OrgId, a.OrgName

样本数据

DECLARE @CsOrganization TABLE (OrgId int, OrgParentId int, OrgName nvarchar(50));
INSERT INTO @CsOrganization (OrgId, OrgParentId, OrgName) VALUES
(1, NULL, 'X COMPANY'),
(2, 1   , 'Administrator'),
(3, 2   , 'Adm 1'),
(4, 2   , 'Adm 2'),
(5, 3   , 'Adm 1_1');

DECLARE @EmHisOrganization TABLE (EmpId int, OrgId int);
INSERT INTO @EmHisOrganization (EmpId, OrgId) VALUES
(1, 2),
(2, 2),
(3, 3),
(4, 4),
(5, 5);

DECLARE @EmOvertime TABLE (EmpId int, TotalOtReal float);
INSERT INTO @EmOvertime (EmpId, TotalOtReal) VALUES
(1, 1.00),
(2, 2.00),
(3, 3.00),
(4, 2.00),
(5, 1.00);

Query

  • CTE_OrgHours计算每个组织所有员工的加班时间的简单总和。
  • CTE_Recursive是遍历组织层次结构的递归 CTE。
  • Final SELECT对遍历的树进行分组,以求树的每个节点(组织)的小时数总和。

逐步、逐个 CTE 运行此查询并检查中间结果,以更好地了解其工作原理。

WITH
CTE_OrgHours
AS
(
    SELECT
        Org.OrgId
        ,Org.OrgParentId
        ,Org.OrgName
        ,ISNULL(SUM(Overtime.TotalOtReal), 0) AS SumHours
    FROM
        @CsOrganization AS Org
        LEFT JOIN @EmHisOrganization AS Emp ON Emp.OrgId = Org.OrgID
        LEFT JOIN @EmOvertime AS Overtime ON Overtime.EmpId = Emp.EmpId
    GROUP BY
        Org.OrgId
        ,Org.OrgParentId
        ,Org.OrgName
)
,CTE_Recursive
AS
(
    SELECT
         CTE_OrgHours.OrgId
        ,CTE_OrgHours.OrgParentId
        ,CTE_OrgHours.OrgName
        ,CTE_OrgHours.SumHours
        ,1 AS Lvl
        ,CTE_OrgHours.OrgId AS StartOrgId
        ,CTE_OrgHours.OrgName AS StartOrgName
    FROM CTE_OrgHours

    UNION ALL

    SELECT
         CTE_OrgHours.OrgId
        ,CTE_OrgHours.OrgParentId
        ,CTE_OrgHours.OrgName
        ,CTE_OrgHours.SumHours
        ,CTE_Recursive.Lvl + 1 AS Lvl
        ,CTE_Recursive.StartOrgId
        ,CTE_Recursive.StartOrgName
    FROM
        CTE_OrgHours
        INNER JOIN CTE_Recursive ON CTE_Recursive.OrgId = CTE_OrgHours.OrgParentId
)
SELECT
    StartOrgId
    ,StartOrgName
    ,SUM(SumHours) AS TotalHours
FROM CTE_Recursive
GROUP BY
    StartOrgId
    ,StartOrgName
ORDER BY StartOrgId;

Result

+------------+---------------+------------+
| StartOrgId | StartOrgName  | TotalHours |
+------------+---------------+------------+
|          1 | X COMPANY     |          9 |
|          2 | Administrator |          9 |
|          3 | Adm 1         |          4 |
|          4 | Adm 2         |          2 |
|          5 | Adm 1_1       |          1 |
+------------+---------------+------------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server - 来自不同表的 CTE 递归 SUM 值 的相关文章

  • #DELETE 在 Access 中查看 SQL Server 表

    今天早上又出现了一个新问题 我的数据库驻留在 SQL Server 上 并使用 Access 作为前端 其中一个已经使用了至少 10 年的数据库今天突然停止工作 我发现这个问题影响了 2 个 可能更多 我没有检查所有 表 当我在访问中打开表
  • 自动打开命名管道和 tcp\ip

    我正在安装一个需要修改 SQL Server 的新产品 具体来说 启用 tcp ip 并打开命名管道 我知道如何手动完成 我想要的是一种通过 SQL 或 C 代码为新客户自动化执行此操作的方法 我希望有任何关于正确方向的建议 您可以使用 C
  • MySQL 偏移无限行

    我想构造一个查询 显示表中的所有结果 但从表的开头偏移 5 据我所知 MySQLLIMIT需要一个限制和一个偏移量 有什么办法可以做到这一点吗 来自MySQL LIMIT 手册 http dev mysql com doc refman 5
  • Oracle使用with子句创建表

    我可以从使用形成的查询创建表吗with clause Sure CREATE TABLE t AS WITH some data AS SELECT 1 as some value FROM dual UNION ALL SELECT 2
  • SQL版本控制方法

    SO 有几个关于 SQL 版本控制的问题 网上有很多资源 但我找不到完全涵盖我想要做的事情的东西 首先 我在这里谈论一个方法论 我熟悉各种源代码控制应用程序 也熟悉 Red Gate 的 SQL Compare 等工具 并且我知道如何编写应
  • 数据库函数 VS Case 语句

    昨天我们遇到了一个场景 必须获取 a 的类型db field在此基础上我们必须编写该字段的描述 喜欢 Select Case DB Type When I Then Intermediate When P Then Pending Else
  • 如何从 SQL Server 的表中获取列名?

    我想查询一个表的所有列的名称 我发现如何做到这一点 Oracle https stackoverflow com q 452464 419956 MySQL https stackoverflow com q 193780 419956 P
  • 如果数组重叠,则折叠多行数组

    我在 PostgreSQL 9 3 中有一个表 其中包含一个列 每行包含一个数组 我正在努力寻找崩溃的方法 共享相同元素的数组行 Examples 简单重叠 给定以下两行数组 1 2 3 5 3 6 9 结果将是一行包含 5 1 2 3 6
  • 如何:SQL 还是 NOSQL?

    我还没有遇到过这个问题 但这就是我的想法 非常肤浅和简单化恕我直言 如果您有键值类型的存储 并且所有访问都是键查找 请使用 NOSQL 解决方案 如果您想要基于值 和子值 进行查找或者有一些更复杂的东西 例如联接 您会选择关系解决方案 事务
  • 通过一个表中的列更新另一表中的列

    我有两张桌子 A 和 B 两者都有一个共同的列 name 并通过列 id 相互链接 表A中的 name 列是空的 而表B中有数据 我的任务是用相应的id填充从表B到表A的该列中的所有数据 我正在使用以下查询 UPDATE A SET A n
  • 在不使用 PHP 的情况下将 MYSQL 中的表字段更新为其值加上常量

    我想表演一个UPDATE in MYSQL其中我获取一个字段值 添加一个常量并将新值保存在同一字段中 假设我们有一个名为OldValue在一个名为aTable 伪代码可能是 UPDATE aTable SET OldValue OldVal
  • SQL选择符号||是什么意思意思是?

    什么是 在 SQL 中做什么 SELECT a b AS letter 表示字符串连接 不幸的是 字符串连接不能在所有 sql 方言之间完全移植 ANSI SQL 中缀运算符 mysql concat 可变参数函数 caution 表示 逻
  • 将插入与 select 语句合并

    这对我有用 MERGE Table1 AS tgt USING SELECT TOP 1 FROM Table2 SELECT itmid FROM Table3 WHERE id id as a WHERE id id AS src ON
  • 触发器以捕获服务器中的架构更改

    是否可以实现类似以下触发器的东西 CREATE TRIGGER tr AU ddl All Server ON DATABASE WITH EXECUTE AS self FOR DDL DATABASE LEVEL EVENTS AS D
  • 需要帮助在 MS Access 中实施完全外部联接

    我无法让查询在 Access 中正常工作 我需要 dbo cardpurchases 和 dbo vendors 上的完整外部联接 以便所有所有供应商都将出现在查询中 无论是否在该供应商处进行购买 但 Access 不支持完全外部联接 我还
  • oracle 数据透视表中的列

    示例选择 select from select 1 cnt 2 sm 55 name 12 month 2011 year 12 2011 mnth txt from dual union all select 1 cnt 2 sm 54
  • Google BigQuery:如何使用 SQL 创建新列

    我想在不使用旧版 SQL 的情况下向现有表添加一列 基本的 SQL 语法是 ALTER TABLE table name ADD column name datatype 我格式化了 Google BigQuery 的查询 ALTER TA
  • SQL Server 全文搜索 - 是否可以在单词中间进行搜索?

    我的数据库有全文搜索 是否可以在单词中间搜索某些文本 例如 我有一个描述列 其中包含以下文本 Revolution 是否可以搜索 EVO 并让它在 革命 一词中找到它 或者我是否一直在做 LIKE SELECT FROM Table WHE
  • 如何在 SQL 中的时区中使用“America/New_York”

    我有这段代码在 SQL 中运行良好 但是我想使用不同的时区格式 例如 America New York 代替 US Eastern Standard Time SELECT TODATETIMEOFFSET CAST CURRENT TIM
  • SSIS ForEach File 循环 - 将文件名插入表

    我正在构建一个 SSIS 包 使用 VS 2017 来从特定文件夹加载一堆 CSV 文件 使用 ForEach File 循环效果很好 数据流任务具有平面文件源和 OLE DB 目标 我希望能够将文件名以及 CSV 文件中的数据保存在同一个

随机推荐

  • Javascript 从变量渲染 jpeg 二进制数据

    如何渲染 Javascript 变量中包含的 JPEG PNG 文件数据 是否可以 需要什么 JavaScript 库 使用的浏览器是FF IE Thanks 现代浏览器支持内联图像 http dean edwards name weblo
  • Django/Heroku:致命:角色的连接太多

    所以我刚刚通过 Heroku 业余爱好 和 Postgres 试用版 推出了一个包含 Channels 2 0 Daphne 2 2 0 和 asgi 的网站 当我启动网站时 我点击了几个页面 然后收到 500 错误 我通过电子邮件收到的错
  • 无法在 Outlook 中正确显示 html 电子邮件签名

    我用 html 为自己创建了一个简单的电子邮件签名 他的代码是 div style width 50px height 50px margin right 10px img src logo png div div style height
  • C# 读取Excel工作表

    有人可以帮我在 C 应用程序中阅读简单的 Excel 工作表吗 我希望能够迭代每一行并在每一列上有一个句柄 谢谢 杆 这是我发现的最简单的方法 从 C 创建 Excel XLS 和 XLSX 文件 https stackoverflow c
  • 如何使用域名setCookie和getCookie

    当我保存 cookie 时 它 会与当前 URL 链接一起存储 当我获取仅搜索当前 URL 的 cookie 时也是如此 我需要使用我自己定义的 URL 链接保存和检索 cookie 你能帮助我吗 您无法读取不同域设置的cookie 如果可
  • 有人能在 android studio 中使用 chromecast android 示例吗?

    我在尝试让这些文件正确加载时经历了一段糟糕的时光 要么是支持框架失败 要么是转换 API 失败 有人有可重复的方法吗 github 示例显示 即将推出 用于加载到 android studio 中 我还没有转换其中一个测试项目 但我已经能够
  • 从 Django 服务器一次传输多个文件

    我正在运行 Django 服务器来为受保护网络中的另一台服务器提供文件 当用户请求一次访问多个文件时 我希望 Django 服务器将这些文件一次性传输给该用户 由于在浏览器中一次下载多个文件并不容易 因此需要以某种方式捆绑文件 我不希望我的
  • 如何将wrapper-div居中而不是内容居中

    我希望我的页面始终在浏览器中居中 而不影响内容 就像align text center 那样 我想将我的包装器 div 居中 我该怎么做 简化现有页面 div div Music Heaven div div div div div div
  • 使用领域驱动设计的node.js

    我正在将应用程序从 C 迁移到 Node js 我一边学习一边学习node js 所以我是一个node js 新手 我正在阅读 领域驱动设计的模式 原则和实践 一书 发现我当前的项目可以从中受益的很多重要信息 例如 书中有一个示例电子商务应
  • 数据绑定与 MVC 根本不兼容吗?

    数据绑定 http en wikipedia org wiki Data binding在视图和模型之间建立直接耦合 从而绕过控制器 从根本上讲 这打破了模型 视图控制器架构模式 我的想法正确吗 这是否会使数据绑定成为一件 坏事 Edit
  • awk 中的“非法主”是什么?

    awk 给我以下错误 awk illegal primary in regular expression lt gt lt at lt gt lt source line number 10 source file transpile aw
  • 如果我在 FFmpeg 中使用 av_read_frame 会丢失多个帧

    我有一个 3500 帧的 HEVC 序列 我正在编写一个解码器来读取它 逐帧读取并转储到 yuv 在我的 main 中 我有一个 for 循环 它调用解码器 3500 次 我假设在这个阶段 main 知道有多少帧 因此 对于每次调用解码器
  • SQL中计算一行中的Null列数

    我想知道是否可以在 SQL 中计算行的空列 我有一个具有可为空值的表 Customer 我只是想要一个查询 该查询返回特定行 特定客户 的空列数的 int 此方法为空列分配 1 或 0 并将它们全部加在一起 希望您没有太多可空列要在此处添加
  • 通过 Node.js 从 iOS 应用程序将图像上传到服务器

    我正在开发一个 iOS 应用程序并且正在使用node js用于服务器端脚本编写 我在从 iOS 应用程序将图像上传到服务器时遇到问题 如果我从网页表单上传图像 它工作正常 但如果从应用程序端上传 则无法正常工作 test file h3 P
  • 从另一个工作表中选择一个复选框

    我在工作表 A 上有一个 ActiveX CheckBox 控件 在工作表 B 上有另一个 ActiveX CheckBox 控件 当我检查 A 处的复选框时 我希望我的宏检查 B 处的复选框 到目前为止我已经尝试过 This http w
  • Sklearn 预处理 - PolynomialFeatures - 如何保留输出数组/数据帧的列名/标题

    TLDR 如何从 sklearn preprocessing PolynomialFeatures 函数获取输出 numpy 数组的标题 假设我有以下代码 import pandas as pd import numpy as np fro
  • 如何使用 django-nonrel 和 mongodb 进行自定义查询

    是否有推荐的方法使用 django nonrel 对 mongodb 进行自定义查询 我已经建立了一个完整的网站并运行良好 现在我只是添加一些地理空间索引和查询 并想知道对于地理空间查询是否已经有支持 或者是否有最佳实践方法来使用定制的询问
  • 是否可以以编程方式在 Web 组件中插入元素?

    是否可以自动或以编程方式插入特定类型的嵌套 Web 组件或元素 而无需指定slot属性在他们身上 考虑这样的结构
  • Bearer error="invalid_token", error_description="发行人无效"

    我有一个简单的 Web api 项目 如下所示 Authorize Route Get public ActionResult
  • SQL Server - 来自不同表的 CTE 递归 SUM 值

    我有一个表 其中的数据分层存储在名为Cs组织如下表所示 Table Name CsOrganization OrgId OrgParentId OrgName 1 NULL X COMPANY 2 1 Administrator 3 2 A