0

別のテーブルから情報を収集して要約を更新するカーソルがあります。これは、頭痛の種となるコード スニペットです。

男性と女性の正確な情報を入力して集計表を更新しようとしています。この情報を合計すると患者の総数になります。

BEGIN
    Set @MaleId =154
    set @Femaleid =655

    if @Category =@MaleId
    begin
        set @Males = @Value
    end
    if @Category = @Femaleid
    begin
        set @CummFemalesOnHaart =@Value
    end 

    Update Stats
       set Males =@Malest,Females =@Females
     where
           Category =@Category and
           periodType =@PeriodType AND StartDate =@Startdate and EndDate =@enddate

問題:

結果が不正確です

organisation PeriodType  StartDate   EndDate     Deaths  Patients  Males  Females
------------ ----------  ----------  ----------  ------  --------  -----  -------
34           Monthly     2010-04-01  2010-04-30  NULL    6843      896    463
34           Monthly     2010-04-01  2010-04-30  NULL    10041     896    463
34           Monthly     2010-05-01  2010-05-31  NULL    10255     898    463 
34           Monthly     2010-05-01  2010-05-31  NULL    7086      898    461
34           Monthly     2010-06-01  2010-06-30  NULL    10344     922    461
36           Monthly     2010-03-01  2010-03-31  NULL    4317      1054   470
36           Monthly     2010-03-01  2010-03-31  NULL    5756      896    470
36           Monthly     2010-04-01  2010-04-30  NULL    4308      896    463
36           Monthly     2010-04-01  2010-04-30  NULL    5783      896    463

男性と女性は、患者の合計数になる単一の行のみを更新する必要があります。

Patients  Males  Females
--------  -----  -------
41        21     20

何か案は?

もう少し明確にするために

/クエリ テーブル/

organisation  PeriodType  StartDate   EndDate     Males  Females 
------------  ----------  ----------  ----------  -----  -------
34            Monthly     01-02-2012  01-02-2012  220    205
34            Monthly     01-02-2012  01-02-2012  30     105

/*ステートメントを更新します*/

Update Stats 
   set Males =@Malest,Females =@Females 
 where 
       --Category =@Category and 
       periodType =@PeriodType AND StartDate =@Startdate and EndDate =@enddate 

統計表 /入力前/

organisation PeriodType  StartDate   EndDate     Deaths  Patients  Males  Females
------------ ----------  ----------  ----------  ------  --------  -----  -------
34           Monthly     01-02-2012  01-02-2012  0       425       null   null
34           Monthly     01-02-2012  01-02-2012  25      null      null   null   
34           Monthly     01-02-2012  01-02-2012  5       null      null   null 
34           Monthly     01-02-2012  01-02-2012  5       135       null   null  

/行をよく見ると、期間の種類、開始日、終了日が同じなので、更新値が患者の合計を含む行以外の行に影響を与えないようにします/

統計テーブル /* 出力 */

organisation PeriodType  StartDate   EndDate     Deaths  Patients  Males  Females
------------ ----------  ----------  ----------  ------  --------  -----  -------
34           Monthly     01-02-2012  01-02-2012  0       425       220    205
34           Monthly     01-02-2012  01-02-2012  25      null      null   null   
34           Monthly     01-02-2012  01-02-2012  5       null      null   null 
34           Monthly     01-02-2012  01-02-2012  5       135       30     105

これがより多くの情報を提供することを願っています

4

3 に答える 3

1

あなたが提案していることは、私が見る限り、常に誤ったデータが割り当てられるリスクがあります。2 つのレコードがあり、1 つは患者 500 (男性 250 と女性 250)、もう 1 つは患者 500 (ただし男性 300 と女性 200) の場合はどうなるでしょうか?

どのレコードの合計を使用するか明確な区別はなく、誤ったデータで複数の更新が行われる可能性があります。

そうは言っても、あなたがすべきことは次のとおりだと思います。

  1. 統計テーブルから患者を選択し、クエリ テーブルから男性/女性を選択する CTE を作成します。ここで、患者 = (男性 + 女性)

  2. 患者の合計で結合された CTE の値を使用して、stats テーブルで update ステートメントを実行します。

これは、私が理解できる限り、あなたが求めているものに対する解決策を提供するはずです.

CTE の詳細については、MSDN Common Table Expressionsを参照してください。

于 2012-05-21T00:47:05.160 に答える
0

私はあなたの質問を完全に理解しているとは言えません...しかし、これがあなたが求めているものだと思いますか?

UPDATE Stats
SET Males = (SELECT COUNT(*) From <queryTable> WHERE Category = @MaleId and periodType =@PeriodType AND StartDate =@Startdate and EndDate =@enddate)
,SET Females = (SELECT COUNT(*) From <queryTable> WHERE Category = @FemaleId and periodType =@PeriodType AND StartDate =@Startdate and EndDate =@enddate)

それが役に立てば幸い!

于 2012-05-18T00:54:10.183 に答える
0

私も質問を理解しているかどうかわかりません。periodTypeしかし、同じ, startDateandを持つ複数のレコードが存在する可能性があると言っているように聞こえますがendDate、 の数が異なりPatientsます。Patients合計数が合計 = と一致するレコードのみをクエリが更新するようにします@Males + @Females

それが正しければ、Patients 値にフィルターを追加します。

    UPDATE Stats 
    SET    Males = @Males,
           Females = @Females 
    WHERE  Category = @Category 
    AND    periodType = @PeriodType 
    AND    StartDate = @Startdate 
    AND    EndDate = @enddate 
    AND    Patients = (@Males + @Females)

余談ですが、カーソルは通常、セットベースの代替手段よりも効率が悪い傾向があります..

于 2012-05-18T06:39:06.643 に答える