6

SQLステートメントについてサポートが必要な場合があります。したがって、次のようなテーブル「cont」があります。

cont_id     name       weight
----------- ---------- -----------
1           1          10
2           1          20
3           2          40
4           2          15
5           2          20
6           3          15
7           3          40
8           4          60
9           5          10
10          6          5

次に、重みの列を合計し、名前でグループ化しました。

name       wsum
---------- -----------
2          75
4          60
3          55
1          30
5          10
6          5

そして、結果には累積列があり、次のようになります。

name       wsum        acc_wsum
---------- ----------- ------------
2          75          75
4          60          135
3          55          190
1          30          220
5          10          230
6          5           235

しかし、私は最後のステートメントを機能させることができませんでした。

編集:この声明はそれをしました(ゴードンに感謝します)

select t.*,
    (select sum(wsum) from (select name, SUM(weight) wsum
    from cont
    group by name)
    t2 where t2.wsum > t.wsum or (t2.wsum = t.wsum and t2.name <= t.name)) as acc_wsum
from (select name, SUM(weight) wsum
from cont
group by name) t
order by wsum desc
4

2 に答える 2

6

したがって、これを行うための最良の方法は、累積合計を使用することです。

select t.*,
       sum(wsum) over (order by wsum desc) as acc_wsum
from (<your summarized query>) t

このorder by節はこれを累積的にします。

(SQL Server 2012およびOracleで)その機能がない場合、合計された重みが個別の値であると仮定すると、相関サブクエリはそれを行う簡単な方法です。

select t.*,
       (select sum(wsum) from (<your summarized query>) t2 where t2.wsum >= t.wsum) as acc_wsum
from (<your summarized query>) t

これは、SQLのすべての方言で機能するはずです。累積された重みが重複している可能性がある状況で作業するには:

select t.*,
       (select sum(wsum) from (<your summarized query>) t2 where t2.wsum > t.wsum or (t2.wsum = t.wsum and t2.name <= t.name) as acc_wsum
from (<your summarized query>) t
于 2012-12-13T15:18:37.967 に答える
1

これを試して

;WITH CTE
AS
(
 SELECT *,
ROW_NUMBER() OVER(ORDER BY wsum) rownum
FROM @table1
 ) 
 SELECT 
 c1.name, 
 c1.wsum,
 acc_wsum= (SELECT SUM(c2.wsum) 
                   FROM cte c2
                   WHERE c2.rownum <= c1.rownum)
 FROM CTE c1;

または、サブクエリを使用する代わりに参加できます

;WITH CTE
AS
(
 SELECT *,
ROW_NUMBER() OVER(ORDER BY usercount) rownum
 FROM @table1
) 
 SELECT 
 c1.name, 
 c1.wsum,
 acc_wsum= SUM(c2.wsum) 
 FROM CTE c1
 INNER JOIN CTE c2 ON c2.rownum <= c1.rownum
 GROUP BY c1.name, c1.wsum;
于 2012-12-13T14:57:39.630 に答える