运行总计结果不正确

时间:2012-05-18 00:00:49

标签: sql sql-server-2008 tsql

我有一个光标从不同的表中收集信息,然后更新摘要,这是让我头疼的代码片段。

我正在尝试通过输入正确的男性和女性信息来更新摘要表,这些信息将累计到患者总数。

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

男性和女性应该只更新加起来总数的单行 E,G

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

/ *更新statetement * /

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  

/ 如果仔细查看行周期类型,startdate,enddate是相同的,所以我不希望更新值影响除了患者总计之外的任何其他行/

统计表/ *输出* /

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

我希望这能提供更多信息

3 个答案:

答案 0 :(得分:1)

根据我的建议,您提出的建议始终存在分配错误数据的风险。当你有两个记录时会发生什么,一个患者500(男性250和女性250),另一个患者500(但男性300和女性200)?

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

话虽如此,我认为你应该做的是以下几点。

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

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

  3. 据我所知,这应该为你所追求的目标提供解决方案。

    您可以在此处详细了解CTE:MSDN Common Table Expressions

答案 1 :(得分: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)

希望它有所帮助!

答案 2 :(得分:0)

我也不确定我是否理解这个问题。但听起来你说有多个记录可以有相同的periodTypestartDateendDate,但是Patients的数量不同。您希望确保查询仅更新Patients总数与您计算的总数匹配的记录,即总计= @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)

尽管如此,游标通常不如基于集合的替代方案效率低。