简体   繁体   English

如何从POSTGRESQL中的UNION查询中减去值?

[英]How do I substract values from an UNION query in POSTGRESQL?

My UNION query is: 我的UNION查询是:

SELECT type, hs
FROM (...) as table_1

UNION

SELECT type, hs
FROM (...) as table_2

UNION 

SELECT type, hs
FROM (...) as table_3

What i want to do is: 我想做的是:

SELECT 
table_1.hs hs_1, 
table_2.hs hs_2,
table_3.hs - (table_1.hs + table_2.hs) hs_3
FROM ()

Just tell me if I have explained myself correctly. 告诉我我是否正确解释了自己。

** Edited **编辑

As asked, I add more details: 根据要求,我添加更多详细信息:

Rows from UNION of all 3 tables are: 来自3个表的UNION行是:

type   | hs
___________
'BLUE' | 8
'RED'  | 2
'ALL'  | 15

What i need is: 我需要的是:

type   | hs
___________
'BLUE' | 8
'RED'  | 2
'REST' | 5

'REST' value is obtained from substracting the addition of 'RED' (2) + 'BLUE' (8) from ALL (15) 通过从ALL(15)中减去'RED'(2)+'BLUE'(8)来获得'REST'值

In Postgresql, something like: 在Postgresql中,类似:

SELECT 
table_1.hs hs_1, 
table_2.hs hs_2,
table_3.hs - (table_1.hs + table_2.hs) hs_3
FROM ()

You can try to use CTE to get the UNION result set. 您可以尝试使用CTE获取UNION结果集。 then use CASE WHEN and subquery make your logic. 然后使用CASE WHEN和子查询构成您的逻辑。

Schema (PostgreSQL v9.6) 模式(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);

Query #1 查询#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   |

View on DB Fiddle 在数据库小提琴上查看

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM