0

假设我有一个表名为 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 只有一个 ID,则 ID 格式为 X(不带破折号);如果新 ID (Y) 是 (X) 的子 ID,则格式为 (XY)。

我想在输出中添加一个新列(总金额),如下所示:

|  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     |
  • “Total Amount”栏是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来测试它。

谢谢你

彭甘

4

2 回答 2

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

请参阅带有演示的 SQL Fiddle

于 2013-06-04T15:24:29.447 回答
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
于 2013-06-04T15:39:05.083 回答