26

これからテーブルの列を変換するにはどうすればよいですか:

ColumnA   ColumnB
2           a
3           b
4           c
5           d
1           a

これに:

ColumnA          ColumnB
3                 a
6(=3+3)           b   
10(=4+3+3)        c   
15(=5+4+3+3)      d 

私はespを見ることに興味があります。どの方法を選ぶか。

4

12 に答える 12

21

このような:

;WITH cte
AS
(
   SELECT ColumnB, SUM(ColumnA) asum 
   FROM @t 
   gROUP BY ColumnB

), cteRanked AS
(
   SELECT asum, ColumnB, ROW_NUMBER() OVER(ORDER BY ColumnB) rownum
   FROM cte
) 
SELECT (SELECT SUM(asum) FROM cteRanked c2 WHERE c2.rownum <= c1.rownum),
  ColumnB
FROM cteRanked c1;

これにより、次のことが得られます。

ColumnA    ColumnB
3             a
6             b
10            c
15            d

ライブデモはこちら

于 2012-10-01T07:10:03.430 に答える
9

私は一般的にそうしようとすることを避けますが、以下はあなたが求めたものと一致します:

declare @T table (ColumnA int,ColumnB char(1))
insert into @T(ColumnA,ColumnB) values
(2    ,       'a'),
(3   ,        'b'),
(4  ,         'c'),
(5 ,          'd'),
(1,           'a')

;With Bs as (
    select distinct ColumnB from @T
)
select
    SUM(t.ColumnA),b.ColumnB
from
    Bs b
        inner join
    @T t
        on
            b.ColumnB >= t.ColumnB
group by
    b.ColumnB

結果:

            ColumnB
----------- -------
3           a
6           b
10          c
15          d

小さなデータセットの場合、これで問題ありません。ただし、より大きなデータ セットの場合、テーブルの最後の行はSUM、元のテーブルの内容全体の取得に依存していることに注意してください。

于 2012-10-01T07:12:20.517 に答える
6

これが最適かどうかはわかりませんが、( SQL Fiddle ):

SELECT x.A + COALESCE(SUM(y.A),0) ColumnA, x.ColumnB
FROM
(
    SELECT SUM(ColumnA) A, ColumnB
    FROM myTable
    GROUP BY ColumnB
) x
LEFT OUTER JOIN
(
    SELECT SUM(ColumnA) A, ColumnB
    FROM myTable
    GROUP BY ColumnB
) y ON y.ColumnB < x.ColumnB
GROUP BY x.ColumnB, x.A
于 2012-10-01T07:11:05.853 に答える
3
create table #T
(
  ID int primary key,
  ColumnA int,
  ColumnB char(1)
);

insert into #T
select row_number() over(order by ColumnB),
       sum(ColumnA) as ColumnA,
       ColumnB
from YourTable
group by ColumnB;

with C as
(
  select ID,
         ColumnA,
         ColumnB
  from #T
  where ID = 1
  union all
  select T.ID,
         T.ColumnA + C.ColumnA,
         T.ColumnB
  from #T as T
    inner join C
      on T.ID = C.ID + 1
)
select ColumnA,
       ColumnB 
from C
option (maxrecursion 0);

drop table #T;
于 2012-10-01T07:17:43.127 に答える
1

SQL Server 2012 以降を使用している場合、必要な結果が得られます。

DECLARE @t TABLE(
    ColumnA int, 
    ColumnB varchar(50)
);

INSERT INTO @t VALUES
(2,'a'),
(3,'b'),
(4,'c'),
(5,'d'),
(1,'a');

SELECT 
    SUM(ColumnA) OVER (ORDER BY ColumnB ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS ColumnA,
    ColumnB
FROM (
    SELECT
        ColumnB,
        SUM(ColumnA) AS ColumnA
    FROM @t
    GROUP BY ColumnB
) DVTBL
ORDER BY ColumnB
于 2020-01-15T11:56:13.913 に答える
-2

同じために以下の単純な選択ステートメントを使用できます

SELECT COLUMN_A, COLUMN_B, 
(SELECT SUM(COLUMN_B) FROM #TBL T2 WHERE T2.ID  <= T1.ID) as SumofPreviousRow FROM #TBL T1;
于 2015-11-20T11:29:46.140 に答える