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

时间:2013-06-04 15:20:08

标签: sql sql-server database tsql sql-server-2012

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

我想添加一个新列(总金额)输出如下:

|  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进行测试。

谢谢

蓬安

2 个答案:

答案 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

请参阅SQL Fiddle with Demo

答案 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