web-dev-qa-db-ja.com

現在の行の累積値+前の行の合計

これからテーブルの列をどのように変換しますか?

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に興味があります。どの方法を選ぶか。

17
Sam

このような:

;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

こちらが ライブデモ

14
Mahmoud Gamal

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

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を取得することに依存していることに注意してください。

これが最適かどうかはわかりませんが、( 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
6
lc.
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;
3
Mikael Eriksson

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

SQL SERVERを使用していますか?そう

C_1、C_2、C_3の3つの列があり、C_1で並べ替えられたテーブルがあるとしましょう。 [Over(Order By C_1)]を使用して、C_3の合計の列を追加します。

C_1、C_2、C_3、Sum(C_3)Over(Order By C_1)を選択します

行番号も必要な場合は、同じ方法で行います。

選択Row_Number()Over(Order By C_1)、 C_1、C_2、C_3、Sum(C_3)Over(Order By C_1)

0
Vahed

以下のスクリプトを試してください。

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) AS ColumnA,ColumnB
FROM    (   SELECT  SUM(ColumnA) AS ColumnA,ColumnB
            FROM    @T  GROUP BY ColumnB )T
0
Abdul Rasheed
DECLARE @t TABLE(ColumnA INT, ColumnB VARCHAR(50));

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

    ;WITH cte
    AS
    (
        SELECT  ColumnB, sum(ColumnA) value,ROW_NUMBER() OVER(ORDER BY ColumnB) sr_no FROM @t group by ColumnB    
    )

    SELECT ColumnB
    ,SUM(value) OVER (   ORDER BY  ColumnB  ROWS BETWEEN UNBOUNDED PRECEDING  AND  0  PRECEDING) 
    FROM cte c1;
0
M Danish