假设我的表名为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 |
我想添加一个新列(总金额)输出如下:
| 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 |
“总金额”列是计算列,其中Amount列中的值与ID列中的(X)相同。
为了获得父ID(X),我使用以下SQL:
SELECT ID, SUBSTRING (ID, 1, IIF (CHARINDEX('-', ID) = 0, len(ID), CHARINDEX('-', ID) - 1) ), Amount FROM tblTemp
如何在SQL Server 2012中以这样的方式进行查询?
您可以使用sqlfiddle here进行测试。
谢谢
蓬安
答案 0 :(得分:4)
您已经完成了大部分工作。要获得最终结果,您可以使用现有查询并将其作为子查询或使用CTE,然后使用sum() over()
来获得结果:
;with cte as
(
SELECT
ID,
SUBSTRING (ID, 1,
IIF (CHARINDEX('-', ID) = 0,
len(ID),
CHARINDEX('-', ID) - 1)
) id_val, Amount
FROM tblTemp
)
select id, amount, sum(amount) over(partition by id_val) total
from cte
答案 1 :(得分:2)
您可以使用sum()
窗口函数执行此操作:
select id, amount,
SUM(amount) over (partition by (case when id like '%-%'
then left (id, charindex('-', id) - 1)
else id
end)
) as TotalAmount
from tblTemp t