mysql 存储过程 获取统计结果

CREATE  DEFINER  =   ' root ' @ ' % '   PROCEDURE  `proc_GetPatientCondition`(
        
IN  iPatientId  INTEGER ( 11 ),
        
IN  dStartDate DATE,
        
IN  dEndDate DATE
    )
    
NOT  DETERMINISTIC
    
CONTAINS  SQL
    SQL SECURITY DEFINER
    COMMENT 
''
BEGIN
Declare  tempDate date;
Declare  tempDayBegin  varchar ( 9 );
Declare  tempNightBegin  varchar ( 9 );
Declare  tempDayTimes  int ;
Declare  tempNightTimes  int ;
Declare  tempFiledBRate  int ;
Declare  tempResultLevel  int ; /*  1,2,3,4 ,when 0 means no result  */
Declare  tempResultByFlag  int /*  1-by day times per week , 2- by night times per month , 3- by FiledBrate  */
Declare  tempIsFinish  int ;
Declare  vSQL  varchar ( 2000 );
Declare  stmt  varchar ( 2100 );
Declare  tempStartDateWeekday  int ;
Declare  tempWeekIndex  int  ;

set  tempDayTimes  =   0 ;
set  tempNightTimes  =   0 ;
set  tempFiledBRate  =   0 ;
set  tempResultLevel  =   0 ;
set  tempResultByFlag  =   0 ;
set  tempIsFinish  =   0 ;

/*  get the day time begin  */
select  concat( '   ' ,ifnull(ParaValue, ' 07:00 ' ), ' :00 ' into  tempDayBegin  from  DBparameter
        
where  ParaKey = ' DayTime ' ;

select  concat( '   ' ,ifnull(ParaValue, ' 20:00 ' ), ' :00 ' into  tempNightBegin  from  DBparameter
        
where  ParaKey = ' NightTime ' ;

/*  define temp table to contains all report dates   */
Drop   TEMPORARY   TABLE   if   exists  temp_tb_dates;
Create   TEMPORARY   TABLE  temp_tb_dates
(reportDate date
,theWeek 
varchar ( 7 )
,theMonth 
varchar ( 7
);

Drop   TEMPORARY   TABLE   if   exists  temp_tb_diarySumm;
Create   TEMPORARY   TABLE  temp_tb_diarySumm
(reportDate date
,theWeek 
varchar ( 7 )
,theMonth 
varchar ( 7
,dayTimes 
int
,nightTimes 
int
,FiledBRate 
int
);

set  tempDate  =  dStartDate;
set  tempStartDateWeekday  =  WEEKDAY(dStartDate);  /*  0-Monday  */
set  tempWeekIndex  =   1 ;
while  tempDate  <=  dEndDate do

    
insert   into  temp_tb_dates(reportDate,theWeek,theMonth)
    VALUE(tempDate, tempWeekIndex ,date_format(tempDate,
' %Y-%m ' ) );
    
    
if  tempStartDateWeekday  =   6   then
        
set  tempStartDateWeekday  =   0 ;
        
set  tempWeekIndex  =  tempWeekIndex  +   1 ;
    
else
        
set  tempStartDateWeekday  =  tempStartDateWeekday  +   1 ;
    
end   if ;
    
    
set  tempDate  =  date_add(tempDate, interval  1   day );
end   while ;

set  vSQL  =   '   ' ;
set  vSQL = CONCAT(vSQL, '  insert into temp_tb_diarySumm ' );
set  vSQL = CONCAT(vSQL, '  select * from   ' );
set  vSQL = CONCAT(vSQL, '  (  ' );

set  vSQL = CONCAT(vSQL, '  select t0.reportDate ,theWeek , theMonth  ' );
set  vSQL = CONCAT(vSQL, '  , ifnull(dayTimes,0) as dayTimes   ' );
set  vSQL = CONCAT(vSQL, '  , ifnull(FiledBRate,0) as FiledBRate  ' );
set  vSQL = CONCAT(vSQL, '  from   ' );
set  vSQL = CONCAT(vSQL, '  (  ' );
set  vSQL = CONCAT(vSQL, '  select reportDate ,theWeek , theMonth  ' );
set  vSQL = CONCAT(vSQL, '  from temp_tb_dates  ' );
set  vSQL = CONCAT(vSQL, '  ) t0  ' );
set  vSQL = CONCAT(vSQL, '  left join  ' );
set  vSQL = CONCAT(vSQL, '  (  ' );
set  vSQL = CONCAT(vSQL, '  select count(recordid) as dayTimes   ' );
set  vSQL = CONCAT(vSQL, '   ,date_format(FiledATime, '' %Y-%m-%d '' ) as reportDate  ' );
set  vSQL = CONCAT(vSQL, '  from DBdiaryFiledA  ' );
set  vSQL = CONCAT(vSQL, '  where patientid= ' , iPatientId);
set  vSQL = CONCAT(vSQL, '   and FiledATime >= ' , '' ' concat(date_format(FiledATime, '' %Y-%m-%d '' ), ''' ,tempDayBegin, ''' ) ' );
set  vSQL = CONCAT(vSQL, '   and FiledATime <  ' , '' ' concat(date_format(FiledATime, '' %Y-%m-%d '' ), ''' ,tempNightBegin , ''' ) ' );
set  vSQL = CONCAT(vSQL, '  group by reportDate  ) t1  ' );
set  vSQL = CONCAT(vSQL, '  on t1.reportDate = t0.reportDate  ' );
set  vSQL = CONCAT(vSQL, '  left join  ' );
set  vSQL = CONCAT(vSQL, '  (  ' );
set  vSQL = CONCAT(vSQL, '  select ((ifnull(max(FiledB),1) - ifnull(min(FiledB),1)) * 200 ) /( ifnull(max(FiledB),1) + ifnull(min(FiledB),1) ) as FiledBRate  ' );
set  vSQL = CONCAT(vSQL, '  ,date_format(gathertime, '' %Y-%m-%d '' )  as reportDate  ' );
set  vSQL = CONCAT(vSQL, '  from DBdiaryFiledBb  ' );
set  vSQL = CONCAT(vSQL, '  where patientid= ' , iPatientId);
set  vSQL = CONCAT(vSQL, '  and FAvailFlag > 0  ' );
set  vSQL = CONCAT(vSQL, '   and gathertime >=  ' , '' , ' concat(date_format(gathertime, '' %Y-%m-%d '' ), ''' , '  00:00:00 ' , ''' ) ' );
set  vSQL = CONCAT(vSQL, '   and gathertime <  ' , '' , ' concat(date_format(date_add(gathertime, interval 1 day), '' %Y-%m-%d '' ), ''' , '  00:00:00 ' , ''' ) ' );
set  vSQL = CONCAT(vSQL, '  group by reportDate ) t3   ' );
set  vSQL = CONCAT(vSQL, '  on t3.reportDate = t0.reportDate  ' );

set  vSQL = CONCAT(vSQL, '  ) t  ' );

set   @sqltext : = vSQL;
prepare  stmt  from   @sqltext ;
execute  stmt;



select   MAX (dayTimesWeek)  into  tempDayTimes 
from
(
select   sum (dayTimes)  as  dayTimesWeek  
from  temp_tb_diarySumm
group   by  theWeek 
) tDay;

select   MAX (nightTimesMonth)  into  tempNightTimes 
from
(
select   sum (nightTimes)  as  nightTimesMonth 
from  temp_tb_diarySumm
group   by  theMonth
) tNight;

select   max (FiledBRate)  into  tempFiledBRate  
from  temp_tb_diarySumm;

if  tempIsFinish = 0   and  tempFiledBRate  >   30   THEN
   
set  tempIsFinish  =   1 ;   
   
set  tempResultByFlag  = 3 ;
   
set  tempResultLevel  =   3 ;
end   if ;

if  tempIsFinish = 0   and  tempFiledBRate  <=   30   and  tempFiledBRate  >=   20   THEN
   
set  tempIsFinish  =   1 ;   
   
set  tempResultByFlag  = 3 ;
   
set  tempResultLevel  =   2 ;
end   if ;

if  tempIsFinish = 0   and  tempFiledBRate  <   20   and  tempFiledBRate  >   0   THEN
   
set  tempIsFinish  =   1 ;   
   
set  tempResultByFlag  = 3 ;
   
set  tempResultLevel  =   1 ;
end   if ;


select  tempResultLevel , tempResultByFlag , tempDayTimes, tempNightTimes ,tempFiledBRate;

   
Drop   TEMPORARY   TABLE   if   exists  temp_tb_dates;
Drop   TEMPORARY   TABLE   if   exists  temp_tb_diarySumm;

END ;

你可能感兴趣的:(mysql)