2012-08-23 35 views
1

我對下表有一個要求。根據最近的客戶端dob查找平均工資的SQL查詢

條件:

  1. 我得把工資客戶的平均值,如果客戶端的誕生差距串行日3天。
  2. 如果客戶之間的差距沒有最近3天的差距,則不需要考慮客戶之間的差距。

實例:下表中
客戶端17與1天差距具有串行DOB以前的clientid的
- >在這種情況下,我會採取工資AVG 17期以15,16 & 17薪水。
客戶18以前有clientid的WITH系列dob's - >在這種情況下,我會以18,177工資收取工資AVG 18,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) 

下面的查詢給予一些messup結果。

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

您可能會嘗試這種做法 - 區別在於從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

嘗試

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 
+0

你幾乎在那裏,謝謝你的帖子。 –

+0

@OverflowUser甚至沒有+1? – Paparazzi

+0

如果我在答案中看到一行缺失,我會評論而不是複製粘貼。 – Paparazzi

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 

你的問題似乎很奇怪。爲什麼日期必須是連續的,爲什麼他們都必須在那裏?如果同一日期和職位上有多個人,會發生什麼情況?

+0

日期應該按照我的項目業務邏輯順序進行。在我的項目中,沒有發生多個具有相同日期和相同工作的人員的情況。 –