假设我有一个名为的表tblTemp
,其中包含以下数据:
| ID | AMOUNT |
----------------
| 1 | 10 |
| 1-1 | 20 |
| 1-2 | 30 |
| 1-3 | 40 |
| 2 | 50 |
| 3 | 60 |
| 4 | 70 |
| 4-1 | 80 |
| 5 | 90 |
| 6 | 100 |
Run Code Online (Sandbox Code Playgroud)
X
如果 ID 只有一个 ID 或 ( X-Y
) 如果它是新 ID ( Y
) 是( ) 的子代,则ID 将被格式化为(不带破折号X
)。
我想添加一个新列(Total Amount)以输出如下:
| ID | AMOUNT | Total Amount |
---------------------------------
| 1 | 10 | 100 |
| 1-1 | 20 | 100 |
| 1-2 | 30 | 100 |
| 1-3 | 40 | 100 |
| 2 | 50 | 50 |
| 3 | 60 | 60 |
| 4 | 70 | 150 |
| 4-1 | 80 | 150 |
| 5 | 90 | 90 |
| 6 | 100 | 100 |
Run Code Online (Sandbox Code Playgroud)
“总金额”列计算为相同X
ID的金额列的总和。
为了获取父 ID ( X
),我使用以下 SQL:
SELECT
ID, SUBSTRING (ID, 1,
IIF (CHARINDEX('-', ID) = 0,
len(ID),
CHARINDEX('-', ID) - 1)
), Amount
FROM
tblTemp
Run Code Online (Sandbox Code Playgroud)
如何在 SQL Server 2012 中编写这样的查询?
您正在寻找的称为窗口函数。它类似于分组,但它允许您在不实际分组的情况下对记录集执行聚合计算。搜索“窗口函数”或“over 子句”应该会给你很多有用的阅读材料。
select
[ID]
,Amount
,[Total Amount] = sum(Amount) over(
partition by left([ID],charindex('-',ID + '-') - 1)
)
from tblTemp
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2166 次 |
最近记录: |