【发布时间】:2018-09-05 14:06:54
【问题描述】:
我有一个数据库表,其中包含放置在树层次结构中的项目。项目有其 ID 和 ParentID。每个项目都有一个分配给它的金额,所以当我在我的层次结构及其金额上提取数据时,它看起来像这样:
| ID | Name | ParentID | Level | Amount |
| 1 | ITEM 1 | NULL | 0 | 100 |
| 3 | - Item 1-1 | 1 | 1 | 100 |
| 7 | - - Item 1-1-1 | 3 | 2 | 100 |
| 8 | - - Item 1-1-2 | 3 | 2 | 100 |
| 4 | - Item 1-2 | 1 | 1 | 100 |
| 9 | - - Item 1-2-1 | 4 | 2 | 100 |
| 10 | - - Item 1-2-2 | 4 | 2 | 100 |
| 2 | ITEM 2 | NULL | 0 | 200 |
| 5 | - Item 2-1 | 2 | 1 | 200 |
| 11 | - - Item 2-1-1 | 5 | 2 | 200 |
| 12 | - - Item 2-1-2 | 5 | 2 | 200 |
| 6 | - Item 2-2 | 2 | 1 | 200 |
| 13 | - - Item 2-2-1 | 6 | 2 | 200 |
| 14 | - - Item 2-2-2 | 6 | 2 | 200 |
假设这是一个新表。我需要从中选择数据并按金额为每个层次结构级别计算组小计,如下所示:
| ID | Name | ParentID | Level | Amount | Group rollup |
| 1 | ITEM 1 | NULL | 0 | 100 | 700 |
| 3 | - Item 1-1 | 1 | 1 | 100 | 300 |
| 7 | - - Item 1-1-1 | 3 | 2 | 100 | 100 |
| 8 | - - Item 1-1-2 | 3 | 2 | 100 | 100 |
| 4 | - Item 1-2 | 1 | 1 | 100 | 300 |
| 9 | - - Item 1-2-1 | 4 | 2 | 100 | 100 |
| 10 | - - Item 1-2-2 | 4 | 2 | 100 | 100 |
| 2 | ITEM 2 | NULL | 0 | 200 | 1400 |
| 5 | - Item 2-1 | 2 | 1 | 200 | 600 |
| 11 | - - Item 2-1-1 | 5 | 2 | 200 | 200 |
| 12 | - - Item 2-1-2 | 5 | 2 | 200 | 200 |
| 6 | - Item 2-2 | 2 | 1 | 200 | 600 |
| 13 | - - Item 2-2-1 | 6 | 2 | 200 | 200 |
| 14 | - - Item 2-2-2 | 6 | 2 | 200 | 200 |
请帮我实现这个目标。
现在,我正在使用此查询来选择数据。但是,它不能正确排序项目并且不进行汇总。您可以将其调整为如上所示对它们进行排序并计算组汇总吗?
WITH cte AS
(SELECT ID,
Name,
ParentID,
0 AS LEVEL,
Amount
FROM MyTable
WHERE ParentID IS NULL
UNION ALL
SELECT t.ID,
t.Name,
t.ParentID,
LEVEL+1,
t.Amount
FROM cte
JOIN MyTable t ON cte.ID = t.ParentID)
SELECT d1.*
FROM cte d1
如果将整个表(所有层次结构)的 TOTAL 汇总放在单独的行中,那就太好了。
【问题讨论】:
-
您使用的是什么类型的服务器? (Oracle/SQL Server/等)什么版本? (SQL Server 2008 / SQL Server 2014 / 等)
-
Microsoft SQL Server 2017
标签: sql group-by sql-server-2017 subtotal