我有一个光标从不同的表中收集信息,然后更新摘要,这是让我头疼的代码片段。
我正在尝试通过输入正确的男性和女性信息来更新摘要表,这些信息将累计到患者总数。
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
我希望这能提供更多信息
答案 0 :(得分:1)
根据我的建议,您提出的建议始终存在分配错误数据的风险。当你有两个记录时会发生什么,一个患者500(男性250和女性250),另一个患者500(但男性300和女性200)?
没有明确的区别,然后使用哪个记录总数,并且您最终可能会使用不正确的数据进行多次更新。
话虽如此,我认为你应该做的是以下几点。
创建一个CTE,从统计表中选择患者,从查询表中选择男性/女性,患者=(男性+女性)
使用CTE加入患者总数的值,在统计表上运行更新语句。
据我所知,这应该为你所追求的目标提供解决方案。
您可以在此处详细了解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)
我也不确定我是否理解这个问题。但听起来你说有多个记录可以有相同的periodType
,startDate
和endDate
,但是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)
尽管如此,游标通常不如基于集合的替代方案效率低。