如何获取以下场景的数据?

时间:2015-10-29 15:13:34

标签: sql-server sql-server-2008

我有4张桌子。

员工:

Id|emp_start_date|Public_id|
01|00-00-00      |001
02|00-00-00      |002

人:

Id|Public_id|name|...
01|001      |aaaa|..
02|002      |bbbb|...

pay_info:

public_id|current_pay_year
001|2015
002|2015

Ni_table:

public_id|Ni_letter_code|Niable_pay|ni_a|ni_b|ni_c|ni_d|year
001      |A             |890        |12 | 12 | 0  | 0  |2015
002      |A             |500        |14 |14  |0   | 0  |2015
002      |A             |600        |14 |14  |0   | 0  |2015
002      |B             |400        |13 | 13 |0   |0   |2015
002      |B             |500        |13 | 13 |0   |0   |2015

我希望通过使用2015年的ni_letter_code获得niable_pay和所有其他列的总和。

我希望获得当前薪资年度的所有员工详细信息。 但是当员工有两个ni字母代码时,他应该有2行代码。 每行应具有相应ni_code的加值。

预期产出:

01|A| 890|12|12|0|0|2015
02|A|1100|25|28|0|0|2015
02|B| 900|26|26|0|0|2015

我的查询:

select
  e.id,
  NI.Ni_letter_code,
  SUM(NI.Niable_pay),
  SUM(ni_a),
  SUM(ni_b),
  SUM(ni_c),
  SUM(ni_d),
  ni.year 
from 
  employee e 
  JOIN  person P ON e.id=P.id
  INNER JOIN pay_info PI ON PI.public_id = E.public_id
  INNER JOIN Ni_table NI ON NI.public_id  = E.public_id 
    AND NI.year =  PI.current_pay_year

1 个答案:

答案 0 :(得分:0)

你似乎认为通过陈述

select
  e.id,
  NI.Ni_letter_code,
  SUM(NI.Niable_pay),
  SUM(ni_a),
  SUM(ni_b),
  SUM(ni_c),
  SUM(ni_d),
  ni.year 

每个e.idNI.Ni_letter_codeni.year都会得到一个结果记录以及所需的总和。

事实并非如此。 SQL不会隐含地通过非聚合列进行聚合。您必须使用GROUP BY显示聚合组。因此,为了获得每e.idNI.Ni_letter_codeni.year一个结果记录,您需要添加:

group by e.id, NI.Ni_letter_code, ni.year

在您的查询结束时:

select
  e.id,
  NI.Ni_letter_code,
  SUM(NI.Niable_pay),
  SUM(ni_a),
  SUM(ni_b),
  SUM(ni_c),
  SUM(ni_d),
  ni.year 
from 
  employee e 
  JOIN  person P ON e.id=P.id
  INNER JOIN pay_info PI ON PI.public_id = E.public_id
  INNER JOIN Ni_table NI ON NI.public_id  = E.public_id 
    AND NI.year =  PI.current_pay_year
group by e.id, NI.Ni_letter_code, ni.year;