繁体   English   中英

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

[英]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.

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