从三个不同的表中获取一个值会给出错误的结果-postgresql
目标是获得任务剩余时间的一个值。我知道我不能对两个连接的表求和,但这个简单的查询让我感到困惑:从三个不同的表中获取一个值会给出错误的结果-postgresql,postgresql,join,Postgresql,Join,目标是获得任务剩余时间的一个值。我知道我不能对两个连接的表求和,但这个简单的查询让我感到困惑: CREATE TABLE tsk (tskid int4, tskhr numeric(8,2)); INSERT INTO tsk (tskid, tskhr) VALUES (1,80.5), (2,120.7); CREATE TABLE hr (hrid int4, hrtsk int4, hrqty numeric(8,2)); IN
CREATE TABLE tsk
(tskid int4, tskhr numeric(8,2));
INSERT INTO tsk
(tskid, tskhr)
VALUES
(1,80.5),
(2,120.7);
CREATE TABLE hr
(hrid int4, hrtsk int4, hrqty numeric(8,2));
INSERT INTO hr
(hrid,hrtsk, hrqty)
VALUES
(1,1,40.5),
(2,2,40.7),
(3,1,1);
CREATE TABLE inte
(inteid int4, intetsk int4, inteqty numeric(8,2));
INSERT INTO inte
(inteid,intetsk, inteqty)
VALUES
(1,1,10.5);
所需输出为
+-------+------+
| tskid | hr |
+-------+------+
| 1 | 28,5 | (80,5-(40,5+1+10,5)
| 2 | 80 | (120,7-40,7)
+-------+------+
我的第一次尝试很简单
SELECT tskid, coalesce(tskhr-hrqty+inteqty,0)
FROM tsk
LEFT JOIN hr on hrtsk=tskid
LEFT JOIN inte on intetsk=tskid
输出
+-------+----------+
| tskid | coalesce |
+-------+----------+
| 1 | 50.5 |
| 1 | 90 |
| 2 | 0 |
+-------+----------+
第二次尝试
SELECT tskid, coalesce(tskhr-(hrqty+inteqty),0)
FROM tsk
LEFT JOIN (SELECT hrtsk, sum(hrqty)hrqty FROM hr GROUP BY 1) h ON tskid =h.hrtsk
LEFT JOIN (SELECT intetsk, sum(inteqty)inteqty FROM inte GROUP BY 1) i ON tskid =i.intetsk;
给出以下结果:
+-------+----------+
| tskid | coalesce |
+-------+----------+
| 1 | 28.5 |
| 2 | 0 |
+-------+----------+
第三次尝试在外部求和也不正确:
WITH list AS(
SELECT tskid, tskhr, hrqty, inteqty
FROM tsk
LEFT JOIN hr on hrtsk=tskid
LEFT JOIN inte on intetsk=tskid)
SELECT tskid, coalesce(sum(tskhr-hrqty+inteqty),0)
FROM list
GROUP BY 1
结果是:
+-------+----------+
| tskid | coalesce |
+-------+----------+
| 1 | 140.5 |
| 2 | 0 |
+-------+----------+
我一定错过了一些明显的东西,但我想不出是什么
小提琴:
子查询也没有运气
TIA,我将对
hr
和inte
表使用单独的子查询:
SELECT
t1.tskid,
t1.tskhr - COALESCE(t2.hrqty, 0) - COALESCE(t3.inteqty, 0) AS hr
FROM tsk t1
LEFT JOIN
(
SELECT hrtsk, SUM(hrqty) AS hrqty
FROM hr
GROUP BY hrtsk
) t2
ON t1.tskid = t2.hrtsk
LEFT JOIN
(
SELECT intetsk, SUM(inteqty) AS inteqty
FROM inte
GROUP BY intetsk
) t3
ON t1.tskid = t3.intetsk;
这种方法之所以有效,是因为子查询避免了连接固有的记录相乘问题。在这种情况下,我们只想对tsk
表中的值进行一次计数,但需要在其他两个表中按任务ID进行聚合。尝试以下方法:
SELECT tskid, tskhr-((select sum(hrqty) ty from hr where hrid = tsk.tskid group by hrid)+ CASE WHEN (SELECT COUNT(*) FROM inte WHERE inteid=tsk.tskid) = 0 THEN 0 ELSE (SELECT intetsk+inteqty FROM inte WHERE inteid=tsk.tskid group by inteid) END) AS hr FROM tsk group by tskid;
完美的非常感谢。我不会忘记单独合并(不是像第二次尝试那样分组)。
那么“0”
无效。双引号表示标识符,这些表中没有名为“0”
的列。你的回答。不要把代码放在注释中