2011-12-23 7 views
2

以前のレコードを取得する方法は、unique_idとdateに依存しますか? 私は私のテーブル(DBO:Daily_Summary):作りたい「Previous_Sum」の機能更新をある前のデータで列を更新する方法

ID Partner  part_no Date  Periode_Sum  Previous_Sum 
1  aa   12 2011-12-21  40    
2  aa   12 2011-12-22  30    40 
3  bb2   13 2011-12-22  20    
4  bb2   13 2011-12-23  30    20 
5       2011-12-24 
6       2011-12-25 
7  aa   12 2011-12-26  30    70 
8  bb2   13 2011-12-27  40    50 
and so on 

を、そして機能だけPeriode_Sumの前のレコードを更新します。パートナー別にグループ化すると、part_noとdate

私の表示クエリでエラーが発生しました。 パートナーで前のレコードを表示するとき、part_noとdate。 previous_sumのレコードには最初のパートナーのみが表示されました。 (partnerpart_no)特定のペアのために一日あたりの複数の行場合

DECLARE @prev_sum INT = 0 
DECLARE @dudut INT = 2 

SELECT @prev_sum = 
(select sum(periode_sum) 
    from Daily_Summary t1 
    where t1.partner_id = ds.partner_id and t1.part_no = ds.part_no 
     and t1.periode_date < ds.periode_date --and t1.id < t.id 
) 
FROM Daily_Summary ds 
where stsrc='A' 
order by ds.partner_id, ds.periode_date 

select partner_id,part_no,model,periode_sum, 
case when @prev_sum is null then @dudut else @prev_sum end 
FROM daily_summary 
where stsrc='A' 
+0

ことがありますか? MySQLまたはSQLサーバー? – Johan

+0

SQLサーバーを使用して – tyo

+0

が "Previous_Sum"の合計「Periode_Sum」をパートナ別、part_noおよび日付別にグループ化していますか?多分サンプルデータの行を追加してください... – gbn

答えて

1
select * into #tab from (
    select 1 as id, 'aa' as partner, 12 as part_no, 
     cast('2011-12-21' as datetime) as date, 40 as periode_sum union all 
    select 2, 'aa', 12, '2011-12-22', 30 union all 
    select 3, 'bb2', 13, '2011-12-22', 20 union all 
    select 4, 'bb2', 13, '2011-12-23', 30 union all 
    select 5, null, null, '2011-12-24', null union all 
    select 6, null, null, '2011-12-25', null union all 
    select 7, 'aa', 12, '2011-12-26', 30 union all 
    select 8, 'bb2', 13, '2011-12-27', 40 
) t 


select *, (select sum(periode_sum) 
    from #tab t1 
    where t1.partner = t.partner and t1.part_no = t.part_no 
     and t1.date < t.date and t1.id < t.id 
) as previous_sum 
from #tab t 

許可されている:私は新しいのparamを宣言し使用してみましたが、動作していない

SELECT ds.partner_id, ds.part_no, ds. periode_in 
     , ds.periode_out, ds.periode_date, ds.periode_sum, 
( 
    SELECT F1.periode_sum 
    FROM Daily_Summary as F1 where 
    F1.periode_sum = 
    ( 
     SELECT Max(F2.periode_sum) 
     FROM Daily_Summary as F2 where F2.periode_date < ds.periode_date 
     and F2.partner_id=ds.partner_id and F2.part_no = ds.part_no 
    ) 
) AS Prev_Value 
FROM Daily_Summary ds 
where stsrc='A' 
order by ds.partner_id, ds.periode_date 

:ここ は私のクエリですand t1.date < t.date and t1.id < t.idの代わりにand t1.date <= t.date and t1.id < t.idを使用してください。 idがすべての行に対して適切な順序(時間内)を確保できる場合は、ちょうどand t1.id < t.idを使用できます。

結果:

id partner part_no date      periode_sum  previous_sum 
1 aa   12   2011-12-21 00:00:00.000 40    NULL 
2 aa   12   2011-12-22 00:00:00.000 30    40 
3 bb2  13   2011-12-22 00:00:00.000 20    NULL 
4 bb2  13   2011-12-23 00:00:00.000 30    20 
5 NULL  NULL  2011-12-24 00:00:00.000 NULL   NULL 
6 NULL  NULL  2011-12-25 00:00:00.000 NULL   NULL 
7 aa   12   2011-12-26 00:00:00.000 30    70 
8 bb2  13   2011-12-27 00:00:00.000 40    50 
+0

ありがとうmichal。しかし、私の問題は、previous_sumがdaily_summaryテーブルの列であるprevious_sumにその条件の関数更新を作成する方法です。 新しいparamを宣言しようとしましたが、関数をロードできません。 – tyo

+0

@tyo、それは私には分かりません。特定の行に対して 'previous_sum'値を返す関数を作成するか、' previous_sum'列の値をすべての行に対して更新するストアドプロシージャを作成しますか?言及した機能と呼び出しのコンテキスト(質問に追加)を表示できますか?期待通りの結果を行として追加してください。 –

+0

あなたが意味するようにストアドプロシージャを作成します。 クエリを作成しましたが、すべての値がNULLになります。 – tyo

関連する問題