为总和数据创建子查询作为 SQL Server 中的新列

Pen*_*gan 2 sql-server t-sql

假设我有一个名为的表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)

“总金额”列计算为相同XID的金额列的总和。

为了获取父 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 中编写这样的查询?

您可以在此处使用sqlfiddle进行测试。

SQL*_*Fox 8

您正在寻找的称为窗口函数。它类似于分组,但它允许您在不实际分组的情况下对记录集执行聚合计算。搜索“窗口函数”或“over 子句”应该会给你很多有用的阅读材料。

select
  [ID]
  ,Amount
  ,[Total Amount] = sum(Amount) over(
    partition by left([ID],charindex('-',ID + '-') - 1)
    )
  from tblTemp
Run Code Online (Sandbox Code Playgroud)