【发布时间】:2016-03-18 04:38:40
【问题描述】:
我现在有以下查询:
SELECT DISTINCT c.Name as CategoryName, SUM(Amount) OVER(partition by c.Name order by c.Name) as Total
FROM Statements s
LEFT JOIN Categories c on c.Id = s.CategoryId
WHERE Date >= '2016-01-01'
ORDER BY c.Name
到目前为止,它可以工作,并且可以获取每个类别的总数,但我需要的是以下内容。
类别可以有子类别。我想获取每一行的每个根类别及其所有子类别的总和。
表示 A 类有子 B 和 C。我想得到 Statements 中所有具有 A、B 或 C 类的条目的总和。
类别表由以下列组成:Id, Name, ParentId。
语句表由以下列组成:Id, Date, Amount, CategoryId
表格类别的样本数据:
Id, Name, ParentId
1, A, null,
2, B, 1
3, C, 2
4, D, null
表Statements的样本数据
Id, Date, Amount, CategoryId
1, 2016-01-01, 100, 1
2, 2016-01-01, 200, 2
3, 2016-01-01, 800, 4
4, 2016-01-01, 300, 3
查询的输出应该如下:
CategoryName, Total
A, 600
D, 800
理想情况下,我可以将 parentCategoryId 传递到示例 null 中的 where 子句中,但也可以是 2。
任何提示表示赞赏:)
【问题讨论】:
-
在不了解您的表结构的情况下无法回答这个问题。样本数据和预期输出也可能非常有用。你应该看看这个:stackoverflow.com/help/how-to-ask
-
@TomH 感谢您的输入,添加了示例数据。
-
Category表中的ParentId真的是类别名称吗?另外,类别树是只深一层还是子类别可以包含自己的子类别? -
@TomH 不,它是类别的 ID。类别树实际上是无限深的
-
你应该在问题中解决这个问题,因为你目前在该列中显示名称。
标签: sql sql-server sql-server-2008 sum