[英]How do I substract values from an UNION query in POSTGRESQL?
我的UNION查询是:
SELECT type, hs
FROM (...) as table_1
UNION
SELECT type, hs
FROM (...) as table_2
UNION
SELECT type, hs
FROM (...) as table_3
我想做的是:
SELECT
table_1.hs hs_1,
table_2.hs hs_2,
table_3.hs - (table_1.hs + table_2.hs) hs_3
FROM ()
告诉我我是否正确解释了自己。
**编辑
根据要求,我添加更多详细信息:
来自3个表的UNION行是:
type | hs
___________
'BLUE' | 8
'RED' | 2
'ALL' | 15
我需要的是:
type | hs
___________
'BLUE' | 8
'RED' | 2
'REST' | 5
通过从ALL(15)中减去'RED'(2)+'BLUE'(8)来获得'REST'值
在Postgresql中,类似:
SELECT
table_1.hs hs_1,
table_2.hs hs_2,
table_3.hs - (table_1.hs + table_2.hs) hs_3
FROM ()
您可以尝试使用CTE
获取UNION
结果集。 然后使用CASE WHEN
和子查询构成您的逻辑。
模式(PostgreSQL v9.6)
CREATE TABLE T1(
type varchar(50),
hs int
);
CREATE TABLE T2(
type varchar(50),
hs int
);
CREATE TABLE T3(
type varchar(50),
hs int
);
INSERT INTO T1 VALUES ('BLUE',8);
INSERT INTO T2 VALUES ('RED' , 2);
INSERT INTO T3 VALUES ('ALL' , 15);
查询#1
WITH CTE AS (
SELECT type, hs
FROM T1
UNION
SELECT type, hs
FROM T2
UNION
SELECT type, hs
FROM T3
)
SELECT CASE WHEN type = 'ALL'
THEN 'REST'
ELSE type END,
CASE WHEN type = 'ALL'
THEN hs - (SELECT SUM(hs) FROM CTE WHERE type in ('RED','BLUE'))
ELSE hs END
FROM CTE;
| type | hs |
| ---- | --- |
| RED | 2 |
| REST | 5 |
| BLUE | 8 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.