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

从我所见,您提出的建议总是冒着分配不正确数据的风险。如果您有两条记录,一条记录有 500 名患者(男性 250 名和女性 250 名),另一份记录有 500 名患者(但男性 300 名和女性 200 名),会发生什么情况?

然后使用哪个记录总数没有明确的区别,您最终可能会使用不正确的数据进行多次更新。

话虽这么说,我认为你应该做的是以下几点。

  1. 创建一个 CTE,从统计表中选择患者,从查询表中选择男性/女性,其中患者 =(男性 + 女性)

  2. 使用加入患者总数的 CTE 中的值在 stats 表上运行更新语句。

据我所知,这应该为您所追求的提供解决方案。

您可以在此处阅读有关 CTE 的更多信息:MSDN Common Table Expressions

于 2012-05-21T00:47:05.160 回答
0

我也不确定我是否理解这个问题。但听起来你是说可以有多个记录具有相同的periodType,startDateendDate,但数量不同Patients。您希望确保查询仅更新总数Patients与您计算的总数匹配的记录,即 total = @Males + @Females

如果正确,请在患者值上添加过滤器:

    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 回答
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 回答