2017-03-21 14 views
3

私はこれを見つけました:How to group/rank records based on a changing value of a column?これは私が探しているものに似ていますが、列の値に基づいてセットをグループ化するには

基本的に、私は次のようになり、データがあります。

Id   UserId  Type   Amount RunningTotal 
----------- ----------- --------------- -------- ------------- 
2759  750   charge   -50.00 -50.00 
2760  750   charge   -125.00 -175.00 
4308  750   paymentGC  50.00 -125.00 
4309  750   paymentGC  125.00 0.00 
19916  750   charge   -1.00 -1.00 
19917  750   creditRefund 124.00 123.00 
23238  750   paymentCC  50.00 173.00 
23239  750   paymentCC  125.00 298.00 
23240  750   charge   -50.00 248.00 
23241  750   charge   -125.00 123.00 
41300  750   creditRefund 125.00 248.00 
42054  750   paymentCC  50.00 298.00 
42055  750   paymentCC  125.00 423.00 
42056  750   charge   -50.00 373.00 
42057  750   charge   -125.00 248.00 
56983  750   creditRefund 125.00 373.00 
63083  750   paymentCC  50.00 423.00 
63084  750   paymentCC  125.00 548.00 
63085  750   charge   -50.00 498.00 
63086  750   charge   -125.00 373.00 
80829  750   creditRefund 125.00 498.00 

これは動作しますが、私はそれがcreditRefundに遭遇するたびにリセットするRunningTotalを必要とします。私はOVER(ROWS BETWEEN CURRENT ROW AND x FOLLOWING)を使用して見ましたが、アカウント上で何が起こるかに応じて、間に行がいくつあってもかまいません。

だから私はもっとこのように見えるためにそれを必要とする:

ここ
Id   UserId  Type   Amount RunningTotal 
----------- ----------- --------------- -------- ------------- 
2759  750   charge   -50.00 -50.00 
2760  750   charge   -125.00 -175.00 
4308  750   paymentGC  50.00 -125.00 
4309  750   paymentGC  125.00 0.00 
19916  750   charge   -1.00 -1.00 
19917  750   creditRefund 124.00 123.00 
23238  750   paymentCC  50.00 50.00 
23239  750   paymentCC  125.00 175.00 
23240  750   charge   -50.00 125.00 
23241  750   charge   -125.00 0.00 
41300  750   creditRefund 125.00 125.00 
42054  750   paymentCC  50.00 50.00 
42055  750   paymentCC  125.00 175.00 
42056  750   charge   -50.00 125.00 
42057  750   charge   -125.00 0.00 
56983  750   creditRefund 125.00 125.00 
63083  750   paymentCC  50.00 50.00 
63084  750   paymentCC  125.00 175.00 
63085  750   charge   -50.00 125.00 
63086  750   charge   -125.00 0.00 
80829  750   creditRefund 125.00 125.00 

は、私がこれまで持っているものです。これを実現する方法について

SELECT Id, UserId, [Type], RunningTotal = SUM(Amount) OVER (ORDER BY t.Id) 
FROM Transactions 
WHERE UserId = @User 

任意のアイデア?実行中の合計がリセットされ、PARTITION BY節を使用できるように、何らかの方法でそれらをグループ化する必要があるように感じます。しかし、私はそれを働かせることができませんでした。それがダウンすると、私はそれがdbから返された後、私はC#でそれを行うことができると思いますが、私はむしろする必要はありません。各グループgrpの開始を識別するためにサブクエリを使用し

答えて

2

、別のグループ番号sumgrpを生成するために、その後のパーティションとしてsumgrpを使用して(lag()を使用して一度だけPaymentCCシーケンシャルがある場合にグループを開始します) RunningTotal

select 
    Id 
    , UserId 
    , Type 
    , Amount 
    , RunningTotal = sum(amount) over (partition by userid, sumgrp order by id) 
    , desired_result 
from (
    select * 
     , sumgrp = sum(grp) over (
      partition by userid 
      order by id 
     ) 
    from (
    select * 
     , grp = (case when type='PaymentCC' 
       and isnull(lag(type) over (
       partition by userid 
       order by id 
       ),'') <> 'PaymentCC' 
      then 1 
      else 0 end) 
    from Transactions 
    ) as g 
) as s 
where UserId = 750 

rextester デモhttp://rextester.com/POX67852

リターン:

+-------+--------+--------------+---------+--------------+----------------+ 
| Id | UserId |  Type  | Amount | RunningTotal | desired_result | 
+-------+--------+--------------+---------+--------------+----------------+ 
| 2759 | 750 | charge  | -50.00 | -50.00  | -50.00   | 
| 2760 | 750 | charge  | -125.00 | -175.00  | -175.00  | 
| 4308 | 750 | paymentGC | 50.00 | -125.00  | -125.00  | 
| 4309 | 750 | paymentGC | 125.00 | 0.00   | 0.00   | 
| 19916 | 750 | charge  | -1.00 | -1.00  | -1.00   | 
| 19917 | 750 | creditRefund | 124.00 | 123.00  | 123.00   | 
| 23238 | 750 | paymentCC | 50.00 | 50.00  | 50.00   | 
| 23239 | 750 | paymentCC | 125.00 | 175.00  | 175.00   | 
| 23240 | 750 | charge  | -50.00 | 125.00  | 125.00   | 
| 23241 | 750 | charge  | -125.00 | 0.00   | 0.00   | 
| 41300 | 750 | creditRefund | 125.00 | 125.00  | 125.00   | 
| 42054 | 750 | paymentCC | 50.00 | 50.00  | 50.00   | 
| 42055 | 750 | paymentCC | 125.00 | 175.00  | 175.00   | 
| 42056 | 750 | charge  | -50.00 | 125.00  | 125.00   | 
| 42057 | 750 | charge  | -125.00 | 0.00   | 0.00   | 
| 56983 | 750 | creditRefund | 125.00 | 125.00  | 125.00   | 
| 63083 | 750 | paymentCC | 50.00 | 50.00  | 50.00   | 
| 63084 | 750 | paymentCC | 125.00 | 175.00  | 175.00   | 
| 63085 | 750 | charge  | -50.00 | 125.00  | 125.00   | 
| 63086 | 750 | charge  | -125.00 | 0.00   | 0.00   | 
| 80829 | 750 | creditRefund | 125.00 | 125.00  | 125.00   | 
+-------+--------+--------------+---------+--------------+----------------+ 
+0

ケースを使用してリセットすることができますそれについて学ぶのに役立ちます。ありがとう!私はこれを試してみましょう。 – ahwm

+0

@ahwmお手伝いします! – SqlZim

0

あなたは私が私の検索でlag` `への参照を見ましたが、それはそれがならば私も言うことができなかったので、言っていたのか理解していない実行中の合計

;with cte as (
select *, sum(amount) over(order by id) RowSum, case when [Type]='creditRefund' Then 1 else 0 end as Num from #yourtable 
) 
, cte2 as (SELECT *, sum(num) over (order by id) ResetFlag from cte) 
select *, sum(case when [Type]='creditRefund' Then 0 else Amount END) over(partition by ResetFlag order by id) from cte2 


create table #yourtable (id int, userid int, type varchar(20), amount float) 

insert into #yourtable (
Id  , UserId , Type  ,  Amount) values 
----------- ----------- --------------- -------- ------------- 
(2759 ,  750  , 'charge  ', -50.00 ) 
,(2760 ,  750  , 'charge  ', -125.00) 
,(4308 ,  750  , 'paymentGC ', 50.00 ) 
,(4309 ,  750  , 'paymentGC ', 125.00 ) 
,(19916 ,  750  , 'charge  ', -1.00 ) 
,(19917 ,  750  , 'creditRefund', 124.00 ) 
,(23238 ,  750  , 'paymentCC ', 50.00 ) 
,(23239 ,  750  , 'paymentCC ', 125.00 ) 
,(23240 ,  750  , 'charge  ', -50.00 ) 
,(23241 ,  750  , 'charge  ', -125.00) 
,(41300 ,  750  , 'creditRefund', 125.00 ) 
,(42054 ,  750  , 'paymentCC ', 50.00 ) 
,(42055 ,  750  , 'paymentCC ', 125.00 ) 
,(42056 ,  750  , 'charge  ', -50.00 ) 
,(42057 ,  750  , 'charge  ', -125.00) 
,(56983 ,  750  , 'creditRefund', 125.00 ) 
,(63083 ,  750  , 'paymentCC ', 50.00 ) 
,(63084 ,  750  , 'paymentCC ', 125.00 ) 
,(63085 ,  750  , 'charge  ', -50.00 ) 
,(63086 ,  750  , 'charge  ', -125.00) 
,(80829 ,  750  , 'creditRefund', 125.00 ) 
関連する問題