SQL Server 列的层次总和

2024-03-23

我按照图表设计了数据库。

  • Category表是自引用父子关系
  • Budget将为每个类别定义所有类别和金额
  • Expense表将包含已花费金额的类别条目(考虑Total此表中的列)。

我想编写选择语句来检索具有以下给出的列的数据集:

ID   
CategoryID   
CategoryName   
TotalAmount (Sum of Amount Column of all children hierarchy From BudgetTable  )   
SumOfExpense (Sum of Total Column of Expense  all children hierarchy from expense table)

我尝试使用 CTE,但无法产生任何有用的东西。提前感谢您的帮助。 :)

Update

我只是为了组合和简化数据,我使用下面的查询创建了一个视图。

SELECT        
    dbo.Budget.Id, dbo.Budget.ProjectId, dbo.Budget.CategoryId, 
    dbo.Budget.Amount, 
    dbo.Category.ParentID, dbo.Category.Name, 
    ISNULL(dbo.Expense.Total, 0) AS CostToDate
FROM
    dbo.Budget 
INNER JOIN
    dbo.Category ON dbo.Budget.CategoryId = dbo.Category.Id 
LEFT OUTER JOIN
    dbo.Expense ON dbo.Category.Id = dbo.Expense.CategoryId

基本上应该会产生这样的结果。


这是一个有趣的问题。我将用 Hierarchyid 来解决它。首先,设置:

USE tempdb;
IF OBJECT_ID('dbo.Hierarchy') IS NOT NULL
    DROP TABLE dbo.[Hierarchy];

CREATE TABLE dbo.Hierarchy 
(
    ID INT NOT NULL PRIMARY KEY,
    ParentID INT NULL,
        CONSTRAINT [FK_parent] FOREIGN KEY ([ParentID]) REFERENCES dbo.Hierarchy([ID]),
    hid HIERARCHYID,
    Amount INT NOT null
);

INSERT INTO [dbo].[Hierarchy]
        ( [ID], [ParentID], [Amount] )
VALUES  
    (1, NULL, 100 ),
    (2, 1, 50),
    (3, 1, 50),
    (4, 2, 58),
    (5, 2, 7),
    (6, 3, 10),
    (7, 3, 20)
SELECT * FROM dbo.[Hierarchy] AS [h];

接下来,使用 hiearchyid 的正确值更新 hid 列。我将为此使用沼泽标准递归 cte

WITH cte AS (
    SELECT  [h].[ID] ,
            [h].[ParentID] ,
            CAST('/' + CAST(h.[ID] AS VARCHAR(10)) + '/' AS VARCHAR(MAX)) AS [h],
            [h].[hid]
    FROM    [dbo].[Hierarchy] AS [h]
    WHERE   [h].[ParentID] IS NULL

    UNION ALL

    SELECT  [h].[ID] ,
            [h].[ParentID] ,
            CAST([c].[h] + CAST(h.[ID] AS VARCHAR(10)) + '/' AS VARCHAR(MAX)) AS [h],
            [h].[hid]
    FROM    [dbo].[Hierarchy] AS [h]
    JOIN    [cte] AS [c]
            ON [h].[ParentID] = [c].[ID]
)
UPDATE [h]
SET hid = [cte].[h]
FROM cte
JOIN dbo.[Hierarchy] AS [h]
    ON [h].[ID] = [cte].[ID];

现在繁重的工作已经完成,您想要的结果几乎可以轻松获得:

SELECT p.id, SUM([c].[Amount])
FROM dbo.[Hierarchy] AS [p]
JOIN [dbo].[Hierarchy] AS [c]
    ON c.[hid].IsDescendantOf(p.[hid]) = 1
GROUP BY [p].[ID];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 列的层次总和 的相关文章

  • CSV 数据中的逗号

    我有一个 CSV 文件 我将其直接导入到 SQL Server 表中 在 CSV 文件中 每一列都用逗号分隔 但我的问题是我有一个 地址 列 并且该列中的数据包含逗号 所以发生的情况是 地址列的一些数据将转到其他列 并将导入到 SQL Se
  • SQL Server 2000 - 将查询分成 15 分钟的块

    我有一个连续时间数据集 我想使用 sql 将其分成 15 分钟的块 如果我能帮忙的话 我不想必须创建一个新表才能做到这一点 i e 时间 计数09 15 109 30 309 45 010 00 210 15 3 有谁知道我该怎么做 我认为
  • 将文件存储在文件系统上或在 SQL Server 中存储为 varbinary(MAX)

    我知道 对于将文件作为 blob 存储在数据库中是否是不好的做法存在很多争议 但我只是想了解这对于我的情况是否有意义 我正在创建一个 ASP NET 应用程序 在一家大公司内部使用 用户需要能够将文件附加到系统中的 作业 这些文件通常是 P
  • 在 SSIS 流中使用临时表失败

    我有一个 ETL 过程 可将约 40 个表从源数据库 Oracle 10g 提取到 SQL Server 2014 开发人员版 临时环境 我的提取过程 确定暂存中的最新行 从源中选择所有较新的行 将结果插入 TEMPTABLE 将 TEMP
  • 具有数百万行的日志表。怎么办?

    我有一个包含数百万行的日志表 我正在考虑将数据分成多个表 即 LoginHistory ExceptionHistory PaymentProcessingHistory 等 在采用包含许多行 而不是列 的大型表并创建多个表时使用的术语是什
  • 无法通过 PyODBC 连接创建数据库

    我在用pyodbc in python 2 7 with MS SQL Server 2008R 这是我创建数据库的代码 SQL代码单独在SQL中工作正常 但在python中执行时崩溃 SQL command IF EXISTS SELEC
  • 收到警告:空值被聚合或其他 SET 操作消除

    我有这个架构 create table t id int d date insert into t id d values 1 getdate 2 NULL 做的时候 declare mindate date select mindate
  • 验证 C# 中的小数是否存储在 SQL Server 中

    我有一个十进制数据库列decimal 26 6 据我所知 这意味着精度为 26 小数位数为 6 我认为这意味着该数字的长度总共可以是 26 位数字 其中小数点后可以有 6 位数字 在我的 WPF C 前端中 我需要验证传入的小数 以便我可以
  • 如何查询最近7天的总计?

    我正在使用 SQL Server 2008 我想编写一个查询来提供给定天数的总活动量 具体来说 我想统计过去 7 天每天的总票数 我的桌子看起来像这样 VoteID VoteDate Vote BikeID 1 2012 01 01 08
  • 警告:mysqli_stmt::bind_param():变量数量与准备好的语句中的参数数量不匹配[重复]

    这个问题在这里已经有答案了 我收到以下错误 Warning mysqli stmt bind param Number of variables doesn t match number of parameters in prepared
  • SQL Proc 从 varchar 到 int 的“转换失败”。为什么要转换?

    我的问题是 为什么它从 varchar 转换为 int 我不确定它想做什么 CREATE PROCEDURE myTestProcedure TransId VARCHAR 15 AS BEGIN DECLARE Result VARCHA
  • #DELETE 在 Access 中查看 SQL Server 表

    今天早上又出现了一个新问题 我的数据库驻留在 SQL Server 上 并使用 Access 作为前端 其中一个已经使用了至少 10 年的数据库今天突然停止工作 我发现这个问题影响了 2 个 可能更多 我没有检查所有 表 当我在访问中打开表
  • .Net 将 NULL 值从变量值插入 SQL Server 数据库

    也有类似的问题 但答案不是我想要的 如果引用为 NULL 或尚未分配值 我想将 NULL 值插入 SQL Server 数据库 目前我正在测试 null 它看起来像 String testString null if testString
  • 选择表中的人员并排除妻子,但合并他们的名字

    我有一张桌子Person PersonID FirstName LastName 1 John Doe 2 Jane Doe 3 NoSpouse Morales 4 Jonathan Brand 5 Shiela Wife And a R
  • Sql 查询抛出标识符太长。最大长度为 128

    我正在处理一个简单的更新查询 在执行查询时看到以下错误 我非常清楚 这根本不应该是一个长度问题 可能是什么问题 Error 以identifier开头的标识符太长 最大长度为 128 我的查询 update dbo DataSettings
  • 如何在 where 子句中使用别名? [复制]

    这个问题在这里已经有答案了 可能的重复 在 WHERE 子句中引用列别名 https stackoverflow com questions 8370114 referring to a column alias in a where cl
  • SQL Server:将 varchar 转换为十进制(也考虑指数表示法)

    我需要转换表的数据并进行一些操作 其中一种列数据类型是Varchar 但它存储decimal数字 我正在努力转换varchar into decimal 我努力了CAST TempPercent1 AS DECIMAL 28 16 问题是数
  • SQL 删除自动命名约束

    我使用脚本在表上创建了一些约束 但未指定约束名称 结果 我最终受到了像这样的限制FK DOC OBGS kntr 54E63309例如 是否可以在不指定确切的约束名称的情况下删除该约束 例如 类似这样的东西 不起作用 ALTER TABLE
  • 如何授予用户访问 SQL Server 中的 sys.master_files 的权限?

    我需要授予数据库用户读取权限sys master files桌子 我怎样才能做到这一点 目前用户拥有以下权限 Calling SELECT on sys master files返回空结果 我还使用以下命令测试了相同的查询sa用户按预期工作
  • 尝试使用 SQL 身份验证登录失败

    我正在尝试使用 sa 用户名及其密码连接到 SQL Server 2008 在 SQL Server 日志文件中我看到以下错误 用户 sa 登录失败 原因 尝试使用 SQL 登录 认证失败 服务器配置为 Windows 身份验证 仅有的 当

随机推荐

  • 如何将受邀用户与邀请人的公司/群组关联起来?

    我正在使用 Django django allauth 和 django invitations 我能够成功邀请用户加入该平台 但我想将他们与邀请者的公司关联起来 我已经阅读了 bee keeper django invitations 但
  • 我可以使用 Apache-Poi 将 Excel 电子表格格式化为流模式下的表格吗

    A regular spreadsheet tab in Excel can be made into a table by selecting the data and ctrl T This gives each column a he
  • 如何检测 Horizo​​ntalScrollView 内的视图何时接触另一个视图?

    所以我试图创建像滚动视图一样的 iMovie 我想在滚动视图内的图像触摸白线时得到回调 这样我就可以更改大图像 我怎样才能做到这一点 这个解决方案对我有用 也是我在对 Horizo ntalScrollView 的选项进行长期研究后能够找到
  • 龙卷风只能升级到websocket错误

    我正在使用龙卷风进行实时应用 我正在为此使用 Redis 当我访问网址时127 0 0 1 8888 2 其中 2 是我的用户 ID 我收到错误消息can Upgrade only to websocket 我不知道为什么我会收到此错误 这
  • 处理“javax/xml/XMLConstants.class”时出现问题

    我正在启动一个新的 Android 项目 该项目引用了一个第三方 JAR 而该第三方 JAR 又引用了其他 4 个 JAR ws commons java5 1 0 1 jar ws commons util 1 0 2 jar xmlrp
  • as3 AIR for android - 应用程序沙箱内容错误

    目标 我试图允许外部加载的 swf 文件与从设备本地加载的文件相互通信 我需要能够访问变量 函数和对象 我在从网上加载 swf 内容时已经实现了这一点 as3 从网络外部加载的swf 控制从网络外部加载的swf https stackove
  • 如何在 Spark 中从文本文件创建 DataFrame

    我在 HDFS 上有一个文本文件 我想将其转换为 Spark 中的数据帧 我正在使用 Spark 上下文加载文件 然后尝试从该文件生成各个列 val myFile sc textFile file txt val myFile1 myFil
  • PHP PDO 数据库错误特殊字符

    我已经阅读了有关这种情况的大部分问题和答案 但我无法解决我的性格问题 我的数据库的默认字符集是utf8 所有表的排序规则是utf8 general ci 我确信所有设置都是 utf8 和 utf8 general ci 因为我已经检查了它们
  • 春天有像温莎城堡里的@predestroy 这样的东西吗

    任何类似的东西 PreDestroy在弹簧框架中 如果您定义了一个实现 DisposableBean 接口的 bean 那么 Spring 将调用 void destroy throws Exception 销毁 Bean 之前的方法 这是
  • Python 3 中未解决的全局变量引用

    所以 我不知道为什么 但我在以下函数中收到来自 Pycharm 的 未解析的引用 警告 它们的共同点是运算中也使用了赋值变量 我不明白为什么这行不通 对于警告的内容有什么想法吗 我确实读过这个线程 PyCharm 中未解决的参考问题 htt
  • py2exe 未找到所有依赖项

    我正在尝试从 python 代码创建一个 exe 我可以从命令行很好地运行代码 如下所示 python myScript py 我从这里安装了 py2exe http sourceforge net projects py2exe file
  • 事务内部只允许Ancestor查询,如何处理?

    我需要在 a 内进行查询Transaction 但是我不知道实体 Id 我拥有的是一个字段的值 例如用户名 但不是ID 换句话说 我无法创建一个Key进行查询 我如何进行查询以获取实体内的实体Transaction 在不深入研究更深层次的设
  • 如何从 C++ Windows 客户端使用 ETW

    我正在研究Windows 事件跟踪 https learn microsoft com en us windows hardware test wpt event tracing for windows ETW 允许用户模式 Windows
  • 我如何退出我的应用程序?

    我如何退出我的应用程序 我希望当用户单击按钮时 该应用程序将完全退出 我看到了任何有关它的答案 但他们将该应用程序带到了后端 我想彻底退出 在这个方法中你可以调用exit 在任何地方运行并退出应用程序 所以要随时关闭应用程序 请使用FLAG
  • 查找目录中的文件数

    Linux 中是否有任何方法可以在 O 1 内计算目录 即直接子级 中的文件数 与文件数无关 而不必先列出目录 如果不是 O 1 是否有一种相当有效的方法 我正在寻找替代方案ls wc l readdir 并不像您想象的那么昂贵 诀窍是避免
  • C#:如何使用 directshow.net 显示此对话框?

    如何使用 Directshow net 调用此对话框 过滤图 https stackoverflow com questions 4680606 c how to open configuration pin dialog 假设您有 IBa
  • C语言中如何释放内存?

    我正在编写具有大量一维和二维数组的代码 我收到 错误 无法分配区域 我认为这是因为分配了太多内存 我使用 malloc 和 free 函数 但我不确定我是否正确使用它们 也许你知道我在哪里可以看到关于 C 内存管理的好例子 所以 我只是想让
  • 没有可用于离线模式的缓存版本 Gradle 插件

    我有一段时间没有使用 Android Studio 但决定更新所有内容并创建一个新项目 如果我转到 首选项 gt 构建 执行 部署 gt Gradle 我会收到上述错误 没有像其他地方建议的那样 离线工作 选项没有可用于离线模式的 grad
  • 绑定 IList 不显示 IMyInterface 继承的接口成员

    我将 IList 绑定到 GridView IMyInterface 看起来像 public interface IMyInterface IHasTotalHours IHasLines DateTime GoalStartDate ge
  • SQL Server 列的层次总和

    我按照图表设计了数据库 Category表是自引用父子关系 Budget将为每个类别定义所有类别和金额 Expense表将包含已花费金额的类别条目 考虑Total此表中的列 我想编写选择语句来检索具有以下给出的列的数据集 ID Catego