我有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
答案 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.id
,NI.Ni_letter_code
和ni.year
都会得到一个结果记录以及所需的总和。
事实并非如此。 SQL不会隐含地通过非聚合列进行聚合。您必须使用GROUP BY
显示聚合组。因此,为了获得每e.id
,NI.Ni_letter_code
和ni.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;