从多个表中提取错误的和-postgresql
PostgreSQL 9.1.13版 我有一个表代码,它链接到我想要求和的几个表 到目前为止,我得到了一个结果,但不是正确的值(JSFIDLE) estrec_sum的总和不会对所有estrec_作业进行总和,并且忽略hr_状态 进一步测试:分别运行每个表可以获得正确的值:从多个表中提取错误的和-postgresql,postgresql,Postgresql,PostgreSQL 9.1.13版 我有一个表代码,它链接到我想要求和的几个表 到目前为止,我得到了一个结果,但不是正确的值(JSFIDLE) estrec_sum的总和不会对所有estrec_作业进行总和,并且忽略hr_状态 进一步测试:分别运行每个表可以获得正确的值: SELECT code_name, SUM(case when estrec_job = '1' then estrec_sum else 0 end) as est FROM code RIGHT JOIN estre
SELECT code_name,
SUM(case when estrec_job = '1' then estrec_sum else 0 end) as est
FROM code
RIGHT JOIN estrec ON code_id=estrec_code
WHERE estrec_job = '1'
GROUP BY code_name
ORDER BY code_name
副本按预期在作业1上获得100
SELECT code_name,
SUM(case when hr_job = '1' then hr_sum else 0 end) as total,
SUM(case when hr_job = '1' and hr_status='0' then hr_sum ELSE 0 END) as unbill,
SUM(case when hr_job = '1' and hr_status='1' then hr_sum ELSE 0 END) as bill
FROM code
RIGHT JOIN hr ON code_id=hr_code
WHERE hr_job = '1'
GROUP BY code_name
结果也是正确的。但是从两个表中提取会返回错误的值
似乎添加另一个右连接会破坏结果
提前感谢您提供的任何线索
我找到了一个解决方案:
SELECT code_name,
(SELECT sum(estrec_sum) from estrec where estrec_code = code_id and estrec_job = '1') as est,
(SELECT sum(hr_sum) from hr where hr_code=code_id and hr_job= '1') as total,
(SELECT sum(hr_sum) from hr where hr_status='0' and hr_code = code_id and hr_job= '1') as unbill,
(SELECT sum(hr_sum) from hr where hr_status='1' and hr_code = code_id and hr_job= '1') as bill
FROM code
尽管这将导致“空行”。我怎样才能摆脱它们呢?非常感谢!我印象深刻 只要hr表中有相应的代码,此查询就可以正常工作。在作业1中添加“WEB”会破坏代码。并且它不会获取此行的“code\u name”
Clodoaldo Neto的原始解决方案“右外连接”给出了一个不完整的结果 (Clodoaldo Neto,但更改为左外连接) (我的解决方案)
知道如何消除“空行”吗?请分享
code
、hr
、estrec
的表结构,并告诉我输出有什么问题。感谢您提供SQLFIDLE。现在我们知道了这些数据的错误结果。现在,请向我们展示此数据的预期(正确)结果。请查看上面的i.stack.imgur.com/YpIKZ.png。似乎所有的条件都不起作用。
select
code_name,
est,
unbill + bill as total,
unbill,
bill
from
code
right outer join (
select
hr_code as code_id,
sum(case when hr_status = '0' then hr_sum else 0 end) as unbill,
sum(case when hr_status = '1' then hr_sum else 0 end) as bill
from hr
where hr_job = '1'
group by hr_code
) hr using (code_id)
right outer join (
select
estrec_code as code_id,
sum(estrec_sum) as est
from estrec
where estrec_job = '1'
group by estrec_code
) estrec using (code_id)
;
SELECT code_name,
(SELECT sum(estrec_sum) from estrec where estrec_code = code_id and estrec_job = '1') as est,
(SELECT sum(hr_sum) from hr where hr_code=code_id and hr_job= '1') as total,
(SELECT sum(hr_sum) from hr where hr_status='0' and hr_code = code_id and hr_job= '1') as unbill,
(SELECT sum(hr_sum) from hr where hr_status='1' and hr_code = code_id and hr_job= '1') as bill
FROM code