SQL查询根据最近的客户端dob查找平均工资

时间:2012-08-23 13:07:53

标签: sql tsql sql-server-2008-r2

我对下表有要求。

条件:

  1. 如果客户连续3天的出生日期差距,我必须取平均工资客户。
  2. 如果客户之间的差距没有最近的3天dob差距,则无需考虑该客户。
  3. 例:
    在下表中 客户端17具有先前的clientid的WITH serial dob,其中1天的间隙 - >在这种情况下,我将以15,16& 17个工资                     客户18具有以前的clientid的WITH serial dob's - >在这种情况下,我将以16,17& 18个薪水。

    表:

    JobType    ClientID     ClinetDOB's         Slaries
    .net        1           2012-03-14              300  
    .net        2           2012-04-11              400  
    .net        3           2012-04-12              200  
    .net        4           2012-07-29              400
    
    .net        5           2012-08-17              1200 
    .net        6           2012-08-18              1400 
    .net        7           2012-08-19              1400
    
    java        8           2012-04-10              400
    java        9           2012-07-29              400  
    java        10          2012-07-30              600  
    
    java        11          2012-08-14              1200  
    java        12          2012-08-15              1800  
    java        13          2012-08-16              1100
    
    java        14          2012-09-17              1200 
    
    java        15          2012-08-18              2400 
    java        16          2012-08-19              2400  
    java        17          2012-08-20              2400  
    java        18          2012-08-21              1500  
    

    结果应该看起来像这样: -

     JobType   ClientID     ClinetDOB's         AVG(Slaries)
    .net        7           2012-08-19              1333
    Java        13          2012-08-16              1366        --This avg of 5,6,7 clientsId's(because they have serial 3days dob's)    
    Java        17          2012-08-20              2400        --This avg of 15,16,17 clientsId's(because they have serial 3days dob's)
    Java        18          2012-08-21              2100        --This avg of 16,17,18 clientsId's(because they have serial 3days dob's)
    

    下面的查询给出一些搞乱结果。

    select t1.ClientID,  
           t1.ClinetDOBs, 
           (t1.Slaries + sum (t2.Slaries)) / (count (*) + 1) Avg_Slaries 
      from table1 t1 
     inner join table1 t2 
        on (t1.ClinetDOBs = dateadd(day, 3, t2.ClinetDOBs) and t1.jobtype = t2.jobtype) 
     group by t1.ClientID,  
           t1.ClinetDOBs, 
           t1.Slaries 
    

    请帮忙。

    提前谢谢!

3 个答案:

答案 0 :(得分:3)

您可以尝试这一点 - 区别在于从t2开始是从前三天开始的行,其中包括正在测试的当前行,因此不需要进行双重求和。另外˙having`删除仅引用自己的行。

select t1.ClientID, 
       t1.ClinetDOBs,
       avg(t2.Slaries) Avg_Slaries
  from table1 t1
 inner join table1 t2
    on t1.ClinetDOBs >= t2.ClinetDOBs
   and t1.ClinetDOBs <= dateadd(day, 3, t2.ClinetDOBs)
   and t1.jobtype = t2.jobtype 
 group by t1.ClientID, 
       t1.ClinetDOBs
having count(*) > 1

You can see it on your last data here

答案 1 :(得分:2)

以下查询连接前三个记录中的每一个。连接都引入数据并充当过滤器以确保有三个:

select tmain.ClientID, tmain.ClinetDOBs,
       sum(tmain.slaries + t1.slaries + t2.slaries)/3.0 as avg_slaries
from table1 tmain join
     table1 t1
     on t1.ClinetDOBs = dateadd(day, -1, tmain.ClinetDOBs) and 
        t1.jobtype = tmain.jobtype join
     table t2
     on t2.ClinetDOBs = dateadd(day, -2, tmain.ClinetDOBs) and 
        t2.jobtype = tmain.jobtype
group by tmain.ClientID, tmain.ClinetDOBs, tmain.Slaries

你的问题似乎很奇怪。为什么日期必须是连续的,为什么它们都必须在那里?如果同一日期和职位上有多个人会怎么样?

答案 2 :(得分:1)

尝试

select t1.ClientID,  
       t1.ClinetDOBs, 
       avg(t2.Slaries)
  from table1 t1 
 inner join table1 t2 
    on t2.ClinetDOBs >= t1.ClinetDOBs) 
       t2.ClinetDOBs <= dateadd(day, 3, t1.ClinetDOBs)
       and t1.jobtype = t2.jobtype 
 group by t1.ClientID,  
       t1.ClinetDOBs