2013-06-04 26 views
0

一個新列假設我有一個表名作爲tblTemp其中有如下數據:創建和數據的子查詢的SQL Server中

| 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將是格式爲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  | 
  • 的「總量」列是金額列的計算列,其總和值,所述(X)在ID列中是相同的。

  • 爲了得到父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進行測試。

謝謝

蓬安

回答

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

+0

感謝bluefeet的幫助。它正在工作。 – Pengan

+0

您如何看待更簡單的'Left(ID,CharIndex(' - ',ID +' - ') - 1)'? – ErikE

+0

@ErikE寫這個的方法有很多,我只是向他們展示他們如何使用他們現有的查詢來得到結果。 – Taryn

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 
+0

感謝Gordon的幫助。它正在工作。 – Pengan

+0

@Pengan。 。 。 'case'語句也可以用原始查詢中的'iif'替換。然而,我堅決主張使用ANSI標準功能而不是數據庫特定功能(在這種情況下可能會變得更糟,因爲'iif'來自Access)。 –