2011-07-22 7 views
2

CASEステートメントから実行中の合計を計算しようとしています。 私は2つのテーブル@report@questionと2つの変数@countCurrent@countSuggestedを持っています。SQLサーバーで合計を計算する

は、静的な値またはI @countCurrent又は@countSuggestedのいずれかをインクリメントする必要@questionテーブルからの値のいずれかと比較@report表中の数字をオフに基づいて。

これまで私がこれまで持っていたのは、いずれかの列で5の組み合わせを得る代わりに、私は0/1しか得られません。私はそれがJOINの一部だと思うが、私は何が見えない。

declare @MinSuccessRate float, 
     @countCurrent int, 
     @countSuggested int 

declare @report table 
(
    intID int identity(1,1), 
    intReportID int, 
    intParticipantID int, 
    acceptable float, 
    optimum float 
) 
insert @report 
    select 1,1,.25,.75 union all 
    select 1,2,.45,.75 union all 
    select 1,3,.35,.75 union all 
    select 1,4,.55,.75 union all 
    select 1,5,.65,.75 

declare @question table 
(
    intID int identity(1,1), 
    intParticipantID int, 
    answer float 
) 

insert @question 
select 1,35 union all 
select 1,55 union all 
select 1,65 union all 
select 1,75 union all 
select 1,85 

SET @MinSuccessRate=0.75 
SET @countCurrent=0 
SET @countSuggested=0 

UPDATE @report 
SET @countCurrent= 
    CASE WHEN acceptable>[email protected] 
     THEN @countCurrent+1 
     ELSE 0 
     END, 
    @countSuggested= 
    CASE WHEN optimum*100 >=q.answer 
     THEN @countSuggested+1 
     ELSE 0 
     END 
FROM @report pr 
    INNER JOIN @question q 
    ON pr.intParticipantID=q.intParticipantID 
WHERE pr.intReportID=1 

select @countCurrent [Current],@countSuggested [Suggested] 

ありがとうございます!

+0

の可能複製(http://stackoverflow.com/questions/814054/complicated -sql-query-for-a-running-total-column) – JNK

+0

なぜそれを総計と呼びますか?あなたや私が紛失しているものがない限り、それは平凡なものです。 – Quassnoi

+0

いいえ、おそらく正しいタイトルではなく、幸いにも以下で解決されているということは間違いありません:) –

答えて

1

をチェックして、各ターゲットレコードは(関係なく、参加によって返された回数の)多くて一度に更新することができます。

しかし、あなたは、すべてここUPDATEは必要ありません:[。現在の合計欄のための複雑なSQLクエリ]

SELECT @countCurrent = 
     SUM 
     (
     CASE 
     WHEN acceptable >= @MinSuccessRate 
     THEN 
       1 
     ELSE 
       0 
     END 
     ), 
     @countSuggested = 
     SUM 
     (
     CASE 
     WHEN optimum * 100 >= q.answer 
     THEN 
       1 
     ELSE 
       0 
     END 
     ) 
FROM @report pr 
JOIN @question q 
ON  q.intParticipantID = pr.intParticipantID 
WHERE pr.intReportID = 1