从多个表中提取错误的和-postgresql

从多个表中提取错误的和-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

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