1

さまざまな活動の期間をリストした表があります。のように見えます

id duration  
1  15  
2  30    
3  30  
4  45  
5  30  

...等

これらの活動を次のように合計したい

for (lastActivity=1 to 5)
  SELECT id, SUM(duration) FROM durations
  WHERE id<=lastActivity

のような出力を生成する

id endtime  
1  15
2  45
3  75  
4  120  
5  150  

ここで、各行は、リスト内の位置までのアクティビティの期間を合計します。

それは簡単な作業のように思えます (おそらくそうです) が、そのような出力を生成するために SQL がどのように見えるべきかわかりません。GROUP BY を OVER 句と一緒に使用してみましたが、おそらくもっと簡単な方法があります。

4

4 に答える 4

1
SELECT t.id, 
       t.duration, 
       rt.runningTotal 
FROM   mytable t 
       CROSS apply (SELECT Sum(duration) AS runningTotal 
                    FROM   emp 
                    WHERE  id <= t.id) AS rt 
ORDER  BY t.id 

このAPPLY演算子を使用すると、クエリの外部テーブル式によって返される各行に対してテーブル値関数を呼び出すことができます。テーブル値関数は右側の入力として機能し、外側のテーブル式は左側の入力として機能します。右の入力は左の入力からの行ごとに評価され、生成された行は最終的な出力のために結合されます。APPLY 演算子によって生成される列のリストは、左側の入力の一連の列の後に、右側の入力によって返される列のリストが続きます。

注 : を使用するAPPLYには、データベースの互換性レベルが 90 以上である必要があります。これは、SQL Server 2005 で導入されました。

于 2012-06-13T10:38:10.293 に答える
1
you can use running total 

この投稿を確認してください

sqlserver stackoverflow の実行中の合計

于 2012-06-13T10:31:04.007 に答える
0

これは、実際のテーブルの大きさに応じて低下しますが、これでうまくいくはずです。これに関するいくつかの興味深い読み物がここにあります

SELECT 1 as id,  15    as num into #test
UNION ALL SELECT 2,  30     
UNION ALL SELECT 3,  30   
UNION ALL SELECT 4,  45   
UNION ALL SELECT 5,  30  

select 
t1.id
,MAX(t1.num) as id_num
,SUM(t2.num) as running_total
from #test t1
LEFT OUTER JOIN #test t2 on t2.id <= t1.id
GROUP BY
t1.id
于 2012-06-13T10:38:36.287 に答える
0

これを試して :

select d2.ID,sum(d1.duration) 
from durations d1,durations d2
where d1.id<=d2.id
group by d2.id
于 2012-06-13T10:50:24.787 に答える