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 は、1 つの ID のみの場合は X (ダッシュなし) の形式になり、新しい ID (Y) が (X) の子である場合は (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     |
  • 「合計金額」列は、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 に答える